QT中子线程TCP通讯问题及解决方案
问题1:在子线程通讯中连接信号槽出现Cannot create children for a parent that is in a different thread.错误
客户端中解决方案:将tcpsocket = new QTcpSocket(); 和 connect (…)代码放入到子线程中进行
服务器端解决方案:服务器端中服务器建立放入run函数中,客户端套接字连接在槽函数中,这时槽函数中代码应该如下,设置connect第五个参数即可解决问题。
//获取客户端连接
socket = server->nextPendingConnection();
//连接QTcpSocket的信号槽,以读取新数据
connect(socket, &QTcpSocket::readyRead, this, &severs::socket_Read_Data,Qt::DirectConnection);
connect(socket, &QTcpSocket::disconnected,this,&severs::socket_Disconnected,Qt::DirectConnection);
问题2:子线程通讯套接字接收不到信息,导致无法通信。
很大原因是因为子线程阻塞或者结束
解决方案:使子线程循环,在循环过程中不要进行阻塞等待(eg:msleep())应该采用非阻塞延时,非阻塞延时如下:
QEventLoop loop;//定义一个新的事件循环
QTimer::singleShot(1, &loop, SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出