QT多线程实现-----问题解决及实现方式(修正及补充)-2024-5-24
-
一、概述
恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用movetothread主要遇到以下几个问题:
1. Socket notifiers cannot be enabled or disabled from another thread。
2. 子线程完成文件传输,发送信号到主线程,主线程接收不到。
使用的协议是:telnet(命令发送)和tftp(文件传输),项目参考及简介文尾。
- 二、问题解决
1. 针对"Socket notifiers cannot be enabled or disabled from another thread":
原因1:在主线程声明套接字时,需要将其移动到子线程。并不能是在主线程中连接,而在子线程中命令发送。
修正原因1:在跨线程通信中,不能将Socket进行移动。而是应该用另一种方法,重写incomingConnection(qintptr handle),通过传递handle参数进行跨线程通信。
错误 正确
原因2:在子线程中使用Telnet协议时,创建对象时,不能在构造函数中进行初始化。
2. 主线程文件传输结束后,子线程接收不到主线程发送的信号。
原因:Qt在使用connect的机制中,由于我们使用的是跨线程机制,所以会默认选择Qt::QueuedConnection的方式。我们选择为
Qt::DirectConnection便可以解决该问题(详解第三部分)。
- 三、详细解释:
1. 关于第一个问题:
movetothread函数的使用,官方链接:https://wiki.qt.io/QThreads_general_usage。在学习多线程的过程中,80%的人使用的是run()函数进行多线程,官方已经重申如何使用多线程。
针对上文表述,进行补充,在多线程中的run()函数的使用和movetothread()各有优势。在网络通信中,可以很好的进行转换。B站有很好的介绍:
链接:https://www.bilibili.com/video/BV1iN411f7dY?p=10&vd_source=cda21aaba0cb327ec08793463507ffa8
2. 关于第二个问题:
链接:https://blog.csdn.net/u011388696/article/details/107854759,对该问题做了很好的阐述。
- 四、项目参考链接:
1.TFTP协议介绍:https://blog.csdn.net/lqy971966/article/details/121810609
2.TFTP项目案例(在git上实在找不到原来的了,附加在百度网盘):
链接: https://pan.baidu.com/s/18APW2e2ZaOCChD_rZphWLg?pwd=d1eh 提取码: d1eh
3.Telnet协议介绍:https://blog.csdn.net/qq_39831862/article/details/82078874
4.Telnet插件及项目(同样的方式,附加在百度网盘):
链接: https://pan.baidu.com/s/1GIs5xjNmeC0a_jYwFRzlFw?pwd=p8xj 提取码: p8xj
五、误导读者,深表歉意,及时更正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具