TCP 通讯问题 QT中子线程TCP通讯问题及解决方案

文章讲述了在QT中使用子线程进行TCP通讯时遇到的问题及解决方案。问题一涉及信号槽跨线程创建,解决方案是确保TCPSocket对象和相关连接都在子线程内。问题二讨论了子线程通讯套接字接收不到信息,建议使用非阻塞延时如QEventLoop避免线程阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值