QThread多线程编程经典案例分析
来源:互联网 发布:win10系统重装软件 编辑:程序博客网 时间:2024/05/21 09:36
传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作。如果用户调用一个比较耗时的操作,就会冻结界面响应。
一个解决方法是按照事件处理的思路:
调用 Void QApplication::processEvents() 或 void QApplication::processEvents ( int maxtime ) 来强迫事件循环进行,但是这种做法是有潜在风险的。按照QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃的说法,当主线程在某个槽函数里正在执行processEvents时, 刚好有一个能响应此槽函数的信号发送过(肯定是其他线程发的信号), 这时就可能会发生可怕的递归, 导致栈溢出崩溃。 原因是processEvents在处理自己槽函数的事件时,又会调用到processEvents,进入到无尽的递归中。
另外一个解决方法是:采用多线程。、
QT QThread多线程编程的方法一直有个争议,就是Bradley T. Hughes:You’re doing it wrong 归纳为3中方法优劣问题:
方法(1):
1. 不使用事件循环。这是官方的 Manual 、example 以及相关书籍中都介绍的一种的方法。
a. 子类化 QThread
b. 重载 run 函数,run函数内有一个 while 或 for 的死循环
c. 设置一个标记为来控制死循环的退出。这里的run函数自己执行了一个循环,不需要事件循环机制了。
方法(2):
这种方法也是Bradley T. Hughes极力批判的 a. 子类化 QThread, b. 重载 run 使其调用 QThread::exec() c. 并为该类定义信号和槽,这样一来,由于槽函数并不会在新开的 thread 运行,很多人为了解决这个问题在构造函数中调用 moveToThread(this);
而争论和不解正是这样的一条语句造成的。
Bradley T. Hughes 给出说明是: QThread 应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码。需要运行的代码应该放到一个QObject的子类中,然后将该子类的对象moveToThread到新线程中。
方法(3):
在Qt4.3(包括)之前,run 是虚函数,必须子类化QThread来实现run函数。而从Qt4.4开始,qthreads-no-longer-abstract ,run 默认调用 QThread::exec() 。这样一来不需要子类化 QThread 了,只需要子类化一个 QObject 就够了,这正是被 Bradley T. Hughes推荐的方法。方法如下
QThread thread; Object obj; Dummy dummy; obj.moveToThread(&thread); QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot())); thread.start();
所以,方法(1)和方法(3)是正确的QT QThread多线程编程方法,方法(2)用的最多,但只是三人成虎,一种不恰当的用法
- QThread多线程编程经典案例分析
- QThread多线程编程经典案例分析
- qt多线程编程之QThread
- QT之QThread多线程编程
- QThread的用法!qt多线程编程
- java多线程经典案例
- 内存经典案例分析
- Qt修炼手册11_多线程编程和QThread类
- QThread多线程学习
- Qt QThread多线程模版
- QThread与多线程
- 一个经典设计案例分析
- Android经典动画案例分析
- 多线程编程经典实例
- QThread QT线程使用案例
- 12_多线程案例分析
- Java多线程之读写锁经典案例
- Java多线程经典案例-生产者消费者
- tc添加视图Custom View
- AsyncTask线程池使用
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- Resources are low on NN. Please add or free up more resources then turn off safe mode manually.
- [leetcode]222. Count Complete Tree Nodes
- QThread多线程编程经典案例分析
- 分布式与集群的联系与区别
- mac环境下重置Mysql密码
- Java的常用类与接口
- 冒泡排序
- Unity2D Sprite Editor 图片切割
- 几种session存储方式比较
- Android 快速开发系列 ORMLite 框架最佳实践
- vue.js-step-everthing-4