系统需要在子窗体中进行一个耗时的数据融合过程,之前意识到UI所在的主线程会被卡死的情况,但因为赶进度需要扩展新功能就暂时没顾上,只用了一种相对妥协的方法,QProgressDialog用于进度的显示,结果是在我的电脑测试没问题,进度条可以活动,但是交给别人还是会出现点击出现卡死,根本原因还是主线程被阻塞。现在终于不想再将就它了,就果断使用多线程改造之,之后发现真的是太爽了,不仅能解决之前的问题还能方便地与主线程进行交互,并且将之前的单任务、单线程的操作一跃成为多任务、多线程。实现方法网上有很多资料,最多的应该就是采取继承QThread的方法,但是我个人比较排斥这种做法,原因就是这种方法并没有从QThread类的立意出发,也即是很容易使人混淆该类的作用,其实他就是一个用来管理线程的功能类而不是线程本身,所以使用一种比较容易理解的QObject::moveToThread(QThread *),这种用起来也很方便而且我可以继承QObject类之后在其中定义多个槽函数,就可以供不同场景下使用同一个QObject对象进行多线程也算是压缩项目容量(不想写的太大,毕竟要考虑方便交接)。

obj=new MyObj;
obj->moveToThread(thrd);
thrd->start();
connect(thrd, SIGNAL(started()), obj, SLOT(go()));
connect(thrd, &QThread::finished, obj, &QObject::deleteLater);
connect(obj, SIGNAL(over()), this, SLOT(threadOk()));

thrd=new QThread;操作可以在构造函数中进行,这样方便在threadOk()槽函数中进行quite和wait操作,只需在析构的时候delete即可,但是我比较郁闷的一点是即使thrd指针绑定到this中最后delete时也不报错,这说不通,理论上所在对象this析构时会自动delete。所以我猜想是显式在析构函数中delete该对象时就不会再重复delete了。

over信号是自定义的MyObject类中的,用于与主线程通信,告知进度等操作,方便使用进度条或MessageList。

注:需要强调一点,因为有可能在MyObject类中有多个操作即多个槽函数(正如前面所说是为了压缩项目容量),所以要避免多个操作之前冲突,尤其是使用第三方库时有时是开源库需要大量附加包含库目录,很可能造成一些奇奇怪怪的错误例如:缺少“{”在函数之前,而这些错误往往出现在外部文件中,这些地方一般是不可能错的,所以基本都是变量或宏定义出现的重定义或者冲突之类的,由此得出最有效的避免这种情况出现的做法是:1)一定不要在头文件中使用统一命名空间(如,using namespace std;)2)变量的定义尽量有意义和个性化避免与第三方库中的变量或宏冲突,即使是局部变量。

Qt中多线程的一种使用相关推荐

  1. QT 中多线程实现方法总结

    第一: 用QtConcurrentRun类,适合在另一个线程中运行一个函数.不用继承类,很方便 第二:用QRunnable和QThreadPool结合.继承QRunnable,重写run函数,然后用Q ...

  2. Qt中多线程间的同步

    文章目录 1 Qt中多线程间的同步 1 Qt中多线程间的同步 多线程编程的本质是什么? 并发性是多线程编程的本质. 在宏观上,所有线程并行执行. 多个线程间相互独立,互补干涉. 常规解决方案设计: 问 ...

  3. Qt创建多线程的两种方法

    来源:https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread 1.摘要 Qt有两种多线程的方法,其中一种是继承QThread的run ...

  4. c#,c++,qt中多线程访问UI控件线程的问题汇总

    c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件. c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke ...

  5. Qt中多线程与界面组件的通信

    文章目录 1 多线程与界面组件的通信 1.1 通过信号与槽实现多线程与界面组件的通信 1.2 通过自定义事件实现多线程与界面组件的通信 1 多线程与界面组件的通信 有趣的问题: 是否可以在子线程中创建 ...

  6. Qt中多线程间的互斥

    文章目录 1 多线程间的互斥 1.1 生产消费者问题 1.2 QMutex 1.3 死锁问题 1.4 信号量 1 多线程间的互斥 值得思考的问题: 多个线程间除了在时序上可能产生依赖,在其它方面是否也 ...

  7. Qt中常用的3种提示框设计方法

    Qt中常用的提示信息设计方法 [问题背景]通常,在项目项目开发的过程中,某些人机交互界面需要对用户的输入数据进行合法性判断,如果用户输入数据合法,则进入下一步流程,否则,就要给出相应的错误提示,以提示 ...

  8. Qt中多线程moveToThread

    Qt中实现多线程的方式.1.利用继承QThread类,重写run函数实习.2.将对象使用moveToThread方法,利用信号槽实现.3.利用QtConcurrent相关QFuture实现. 以前一直 ...

  9. QT 5.11.1 + OpenGL 第一篇(OpenGL在Qt中几个版本)

    旧版本的Qt中,模块OpenGL提供了QGL开头类,不提倡使用,只是为了兼容低版本的Qt. 新版本的Qt中,有两种方式: 1.Qt的GUI模块中的QOpenGL开头的类. 2.Qt的Widget模块中 ...

最新文章

  1. 怎样查找this的指向
  2. 如何读取超大文本文件
  3. linux centos 7安装 apache php 及mariadb
  4. mysql多表 性能_Mysql 多表联合查询效率分析及优化
  5. NP管理器v3.0.25 一键添加去除apk对话框等
  6. BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
  7. QCC3020/QCC3040 TWS耳机按键切换EQ,APP切换EQ功能实现
  8. 鸿蒙系统和安装包,鸿蒙系统安装包
  9. PNP与NPN的转换电路
  10. BTA 常问的 Java基础39道常见面试题
  11. Samba服务器的配置全过程
  12. idea 使用自动注解时候红色警告的消除办法
  13. c++ 堆优化版dijkstra 代码实现
  14. solr mysql 增量索引_solr中实现MySQL数据全量索引和增量索引
  15. Ory Hydra 详解之入门
  16. Cocos2d-x 3.0心得(01)-图片加载与混合模式
  17. Model-Based Value Expansion for Efficient Model-Free Reinforcement Learning(mve)
  18. 微信企业转账JAVA版(包括:1,转账个人零钱;2,转账个人银行卡;3,微信官网的SDK3.0.9存在的支付问题)
  19. uniapp 封装微信支付宝web端扫一扫
  20. linux cdma时间,Linux环境下CDMA 1X 无线上网的实现

热门文章

  1. Java编程基础(入门)
  2. Node.js 学习(持续更新)
  3. 考研数据结构判断题整合
  4. linux下安装mysql数据库[yum install版]
  5. Ghost高级教程——克隆备份
  6. 【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡
  7. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?
  8. 《操作系统真象还原》第五章 ---- 轻取物理内存容量 启用分页畅游虚拟空间 力斧直斩内核先劈一角 闲庭信步摸谈特权级
  9. Python_Task07:类、对象与魔法方法
  10. Yahoo Programming Contest 2019 D-Ears