linux下线程状态DW,Vscode Linux下opencv及多线程socket(3)--Apple的学习笔记

本周进行了HMI系统的重大更新,包括在图片显示中增加ROI区域和logo,服务器从Windows迁移到Linux,实现recv的selectIO复用以支持断线重连。接下来计划重构HMI为独立进程,添加图片监视和报警功能,并进行性能测试。图片叠加通过读取预设数字和logo图片,利用OpenCV进行ROI区域叠加。select模型的调整解决了长时间后返回0的问题,确保了稳定运行。
摘要由CSDN通过智能技术生成

一,本周做了变更(版本变更为0.3)

1. HMI图片显示添加ROI区域显示张数及叠加特质logo。

2. Server端切换到linux系统上。

3. recv存阻塞修改设计为select IO复用的异步形式,实现了断线也能重连的功能。

4. 对client测试code的重连函数中connect函数也使用非阻塞,加快重连速度。

二,后续更新版本说明:

之前的2.4/2.5算完成了,后续需要完成

2.6 重构HMI,分离为一个进程。

2.7 添加对图片的监视作用,添加弹窗报警及logDTC记录。(目的是使用进程间通信和共享内存)

2.8 添加守护进程。

2.9 进行性能测试,进行优化。

三,图片叠加设计说明

关于添加log及页数的方法:

每收到一帧则页数加1,将页数转为单个的字符串,自己制作0~9及logo的图片。将个十百千数字的位置及logo的位置固定后,进行opencv的ROI区域叠加即可。在原有函数中添加ROIhandler处理函数。

void HMI::ROIhandler(ServerEx *serv)

{

/* Add logo ROI */

cv::Mat mylogo = cv::imread("./pic/logo.png");

cv::Mat imgROIlogo = serv->Img(cv::Rect(0, 0, mylogo.cols, mylogo.rows));

mylogo.copyTo(imgROIlogo, mylogo);

std::string suffix = ".png";

/* int to string */

std::string res = std::to_string(serv->page);

/* stuff zero on the right*/

while (res.size() < 4)

{

res = "0" + res;

}

/* setting number ROI get each item in string */

cv::Mat numthousand = cv::imread("./pic/" + res.substr(0, 1) + suffix);

cv::Mat imgROInumthousand = serv->Img(cv::Rect(mylogo.cols + 10, 0, numthousand.cols, numthousand.rows));

numthousand.copyTo(imgROInumthousand, numthousand);

cv::Mat numhundred = cv::imread("./pic/" + res.substr(1, 1) + suffix);

cv::Mat imgROInumhundred = serv->Img(cv::Rect(mylogo.cols + 30, 0, numhundred.cols, numhundred.rows));

numhundred.copyTo(imgROInumhundred, numhundred);

cv::Mat numtens = cv::imread("./pic/" + res.substr(2, 1) + suffix);

cv::Mat imgROInumtens = serv->Img(cv::Rect(mylogo.cols + 50, 0, numtens.cols, numtens.rows));

numtens.copyTo(imgROInumtens, numtens);

cv::Mat numunits = cv::imread("./pic/" + res.substr(3, 1) + suffix);

cv::Mat imgROInumunits = serv->Img(cv::Rect(mylogo.cols + 70, 0, numunits.cols, numunits.rows));

numunits.copyTo(imgROInumunits, numunits);

}

void HMI::DisplayFrame(ServerEx *serv)

{

if ((this->_showEn == TRUE) && (serv->revOK == TRUE))

{

ROIhandler(serv);

/* show picture */

cv::imshow("pic", serv->Img);

cv::waitKey(1);

}

}

四,关于select模型的设计说明

一开始调试的时候,select过一段时间后就会一直返回0。明明已经设置了timeout时间为3s,这是为什么。通过wireshark监控没有发现超时,最后才知道每次select调用的时候timeout需要重新初始化为3s。

经过修改后,除非断线,否则不会返回0。因为一帧图片数据在1s内即可传输完毕。select函数的设计框架如下。

this->myServerEx->select_zero();

this->myServerEx->select_set();

//重新select需要重新设置timeout值

ret = this->myServerEx->myselect();

if (ret == -1)

{

//出错处理

}

else if (ret == 0)

{

//超时处理

}

else

{

if (this->myServerEx->select_iset())

{

//正常执行

}

}

void ServerEx::select_clr()

{

FD_CLR(this->getConnectfd(), &this->read_fds);

}

void ServerEx::select_zero()

{

FD_ZERO(&this->read_fds);

}

void ServerEx::select_set()

{

FD_SET(this->getConnectfd(), &this->read_fds);

}

int ServerEx::select_iset()

{

return (FD_ISSET(this->getConnectfd(), &this->read_fds));

}

int ServerEx::myselect()

{

this->tv.tv_sec=3; //reset the timeout value

this->tv.tv_usec=0;

return (select(this->getConnectfd() + 1, &this->read_fds, NULL, NULL, &this->tv));

}

五,运行效果图

实际效果.png

client.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值