-
一、概述
恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用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:在主线程声明套接字时,需要将其移动到子线程。并不能是在主线程中连接,而在子线程中命令发送。
错误 正确
原因2:在子线程中使用Telnet协议时,创建对象时,不能在构造函数中进行初始化。
2. 主线程文件传输结束后,子线程接收不到主线程发送的信号。
原因:Qt在使用connect的机制中,由于我们使用的是跨线程机制,所以会默认选择Qt::QueuedConnection的方式。我们选择为
Qt::DirectConnection便可以解决该问题(详解第三部分)。
- 三、详细解释:
1. 关于第一个问题:
movetothread函数的使用,官方链接:https://wiki.qt.io/QThreads_general_usage。在学习多线程的过程中,80%的人使用的是run()函数进行多线程,官方已经重申如何使用多线程。
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
标签:QT,主线,文件传输,发送,线程,https,-----,多线程 From: https://www.cnblogs.com/wxd-/p/18033710