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

  五、误导读者,深表歉意,及时更正。

 

posted @   二先生-  阅读(1002)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示