Qt线程实现分析-moveToThread vs 继承
最近抽空研究了下QThread,使用起来方式多种多样,但是在使用的同时,我们也应该去了解Qt的线程它到底是怎么玩儿的。
Qt的帮助文档里讲述了2种QThread的使用方式,一种是moveToThread,另一种是继承QThread实现run方法,下面我们分别来分析下
一、moveToThread
首先我们来先分析move这种方式,他的使用可能像下面这样
class Worker : public QObject
{
public slots:
void doWork(const QString &) {
emit resultReady(result);
}
};
class Controller : public QObject
{
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
};
这是一个标准的多线程使用方式,复杂的逻辑操作我们可以放在Worker对象的槽函数中进行,因为只有槽函数是在工作线程中执行的,下面我记录了各个函数执行时所在的线程ID
由于线程ID是每次会发生编号,可能每个人测试的结果不一样
- Worker(): 0x4c34 主线程
- doWork(): 0x40c8 工作线程
- handleResults(): 0x4c34 主线程
- ~Worker(): 0x40c8 工作线程
细心的同学就会发现了,Worker对象的构造函数和析构函数不在同一个线程里边:Worker对象的事件循环已经放到子线程中了,Worker对象删除时,是工作线程通过抛出DeferredDelete事件执行的
下面结合我自己之前的一些使用理解,来分析下moveToThread是如何运作的:
假设有这么一种场景,需要把对象obj从线程A移动到线程B
首先我自己看了Qt的这个函数源码,这里把他翻译成为了白话文,我们大家可以来看下
1、一些异常判断
- 确认不在同一个线程里
- 移动的对象不能有父类
- 不能移动Widget窗体
- 支持移动一个无所属线程的对象到指定线程
- 对象不在C线程时,C线程不能把对象移动到B线程,只有A线程可以
2、moveToThread_helper
- 构造ThreadChange事件,发送给自己
- 迭代所有子对象,并执行moveToThread_helper方法
3、setThreadData_helper
- 循环遍历,把线程A中obj对象的所有事件移动到B线程中
- 如果移动了新事件到线程B中,则我们需要唤醒B线程,让他去派发事件
- 迭代所有子对象,并执行setThreadData_helper方法
二、继承QThread
假设说我们继承QThread实现了一个UsThread,使用起来可能像这样
UsThread thd;
经过我的实践,很可惜,除了run函数以外,所有的函数执行,包括对象都在主线程中
如果你想着thd.moveToThread这么干,那么可能会被打死
结论:个人推荐使用moveToThread这种方式进行子线程编写
更详细的测试结果可以参考
QThread使用——关于run和movetoThread的区别
Qt线程实现分析-moveToThread vs 继承的更多相关文章
- Qt线程(1) moveToThread
若在Qt准备使用线程类一般有两种方式(1) 采用WorkObject配合QThread进行使用 (2)继承QThread, 重载run()函数即可. 注:采用Qt::Concurrent之类的不在本文 ...
- QT线程使用收集示例
关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力.个人倾向于用boost.thread, boost.mpi. 一 ...
- Qt源码分析之QObject
原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...
- QT源码分析(从QApplication开始)
QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...
- Qt 线程基础(QThread、QtConcurrent、QThreadPool等)
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使 ...
- Qt线程(2) QThread中使用WorkObject
一般继承QThread的WorkThread都会在重载的run()中创建临时的WorkObject,这样能确定这个WorkObject在该thread中使用 那如果这个WorkObject是个Sing ...
- QT核心编程之Qt线程 (c)
QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- Qt 学习之路 :Qt 线程相关类
希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必 ...
随机推荐
- vs中代码的发行以及图标的添加
发布代码,将Debug改成Release 在属性代码生成中找到运行库将多线程MD改成MT应用(使文件适用于普遍的电脑) 重新生成解决方案然后就可以在项目文件夹中找到Release底下的.exe文件(可 ...
- springboot 项目的https的发布
1.生成密钥证书 生成命令: keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize -keystore keysto ...
- vue-cli报错:Class constructor FileManager cannot be invoked without 'new'
bug:vue-cli3开发的项目,今天项目重新下载依赖启动项目的时候出现错误:Class constructor FileManager cannot be invoked without 'new ...
- Google Protocol Buffer Basics: C++
proto文件简介 每个元素上的"= 1","= 2"标记标识该字段在二进制编码中使用的唯一"标记" 每个字段有三个可选修饰符 requir ...
- vue父子组件通信高级用法
vue项目的一大亮点就是组件化.使用组件可以极大地提高项目中代码的复用率,减少代码量.但是使用组件最大的难点就是父子组件之间的通信. 子通信父 父组件 <template> <div ...
- HDU 5984 题解 数学推导 期望
Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decorative s ...
- 学习笔记(一)-PyTorch在Windows环境搭建
一.安装Anaconda 3.5 Anaconda是一个用于科学计算的Python发行版,支持Linux.Mac和Window系统,提供了包管理与环境管理的功能,可以很方便地解决Python并存.切换 ...
- net start mysql提示:服务名无效
1.win+R打开运行窗口,输入services.msc 2.在其中查看mysql的服务名,我的是MySQL55 3.以管理员身份打开cmd,输入net start MySQL55 出现下图,代表my ...
- Linux音频编程(一)ALSA介绍
Linux下的音频编程中有OSS和ALSA,本篇文章将对ALSA进行相关介绍.ALSA提供一系列基于命令行的工具集,比如混音器(mixer),音频文件播放器(aplay),以及控制特定声卡特定属性的工 ...
- http gzip压缩功能记录
版权声明:本文为博主原创文章,转载请附上原文出处链接. 本文链接:https://www.cnblogs.com/shaoshuai95928/articles/Tomcat.html 最近在spri ...