首页 > 其他分享 >QT多线程实现-----问题解决及实现方式

QT多线程实现-----问题解决及实现方式

时间:2024-02-26 15:13:56浏览次数:20  
标签:QT 主线 文件传输 发送 线程 https ----- 多线程

  • 一、概述

  恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用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

相关文章

  • 2016-07-30-Android中的类加载器及类加载流程
    Android中的类加载器及类加载流程Android中的类加载器有三种,DexClassLoader、PathClassLoader、BootClassLoader。其中BootClassLoader是系统启动时预加载常用类的,一般使用不到。DexClassLoader、PathClassLoader都是继承自BaseDexClassLoader。但DexClassLoader和PathClassLo......
  • 21、oracle报ORA-04091发生了变化, 触发器函数不能读它
    21、oracle报ORA-04091发生了变化,触发器函数不能读它​ 在对某表进行更新的时候,调用了一个函数,函数中又使用该表进行读的操作,会导致读取到错误的数据。所以在函数中进行事务的锁定。解决方案:在begin之前增加pragmaautonomous_transaction;,在end之前增加commit;funcation......
  • LightDB-X 24.1 支持 Oracle DBMS_STATS.GATHER_TABLE_STATS 存储过程
    LightDB-X24.1支持OracleDBMS_STATS.GATHER_TABLE_STATS存储过程背景LightDB-X一直在不断提升对Oralce的兼容性,降低基于Oracle的业务系统迁移到LightDB-X的门槛。在24.1版本中支持了Oracle的DBMS_STATS.GATHER_TABLE_STATS存储过程,提高了对Oracle管理功能......
  • 部署K8S-1-26
    DEVops入门1部署K8S1.1节点准备节点名ip功能k8s-master10.0.0.153k8s-node110.0.0.154k8s-node210.0.0.1551.2初始操作在所有节点执行#1关闭防火墙systemctldisablefirewalldsystemctlstopfirewalldfirewall-cmd--state#2关闭seli......
  • 部署K8S-1-23
    DEVops入门1部署K8S1.1节点准备节点名ip功能k8s-master10.0.0.150k8s-node110.0.0.151k8s-node210.0.0.1521.2初始操作在所有节点执行#1关闭防火墙systemctldisablefirewalldsystemctlstopfirewalld#2关闭selinuxsed-i's/enforci......
  • 4-1. 创建人物状态栏
    ColourfulHierarchyCategoryGameObject插件用于美化Hierachy窗口通过查看ColorPalette可以知道用法UIInputSystem冲突我们的项目使用了最新的InputSystem,所以需要按上图所示进行操作,以便UI也可以享受到新InputSystem的福利切图找到Base-UI然后自......
  • 黑客类杂志说明-收集
    前言全局说明黑客杂志说明一、说明黑客杂志,由难->易《黑客防线》->《黑客手册》->《黑客x档案》https://www.zhihu.com/question/31905047二、《黑客防线》官网:http://www.hacker.com.cn1999年黑客防线是《家庭实用电脑世界》的一个版面。编辑:土豆(真名覃华,广......
  • 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型
    Reactor模型是一种常见的高并发设计模式,特别是在网络编程中。在Reactor模型中,一个或多个输入同时传递给一个或多个服务处理程序。服务处理程序对输入进行处理,然后将结果传递给相应的输出处理程序。使用IO复用技术(如epoll)和线程池,可以实现多线程的Reactor高并发模型。下面是一个简......
  • Qt的拖拽操作例子
    本文是一个拖拽文本的例子。演示了如何把按钮的标题拖拽到文本编辑框里。Qt对拖拽的封装很好,QDrag对象简单易用。本文程序测试环境是VS2017和Qt5.9。下面是程序拖拽时的效果图,可以看出来拖拽的时候光标下方也显示了文本内容:头文件。本功能是在主窗口中实现的。下面代码里QtTest......
  • Vue 学习笔记15--用户代码片段
    { //Placeyour全局snippetshere.Eachsnippetisdefinedunderasnippetnameandhasascope,prefix,bodyand //description.Addcommaseparatedidsofthelanguageswherethesnippetisapplicableinthescopefield.Ifscope //isleftemptyor......