[quote=引用 9 楼 lr2131 的回复:] [quote=引用 8 楼 走好每一步 的回复:] waitForReadyRead 这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。 后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。
QT源码你要注意,它是分接口类和私有数据类的,然后真正是实现功能的分windows版本和linux版本。
[quote=引用 8 楼 走好每一步 的回复:] waitForReadyRead 这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。 后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。
waitForReadyRead 这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。 后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。
3楼正解 waitForReadyRead(10);设置一个超时等待时间,如果没有串口数据导致超时退出,然后线程中继续下一次循环,可以在此时加入退出线程处理。 ============================== while(1) { //串口关闭的场合,线程退出 if(!serial_port_open) { break; } if(waitForReadyRead(10)) { readall } else { sleep(10); } } }
纠正一下waitForReadyRead(-1),并不是睡眠,而是无限循环查看读buf有没有新的数据 没必要一直查的 ThreadFun{ if(waitForReadyRead(10)) { readall } else{ sleep(10); } }
1、改成异步read 2、可以试试socket 强制断开。 比如 soket.abort()
16,201
社区成员
26,591
社区内容
加载中
试试用AI创作助手写篇文章吧