QThread线程详细用法

  • 详细说明
    • 方法I:继承Qthred
    • 方法II:move to thread

在做GUI界面编程的时候一般都会遇到 耗时的操作,导致 主线程(GUI线程)卡住,一般的操作是将该耗时操作移动到 工作线程中执行。若是需要同GUI进行交互(比如拷贝一个大文件需要显示进度条),这个时候可以采用Qt自带的线程管理类函数Qthread。

详细说明

QThread类提供了一种独立于平台的线程管理方法。
一个QThread对象管理程序中的一个控制线程。
说白了Qthread只是一个中介者,起到代管作用。
打个比方,你是老板要找瓦匠给你砌墙,可你不认识瓦匠,也不知道如何和他们沟通。(不会使用原生线程)
为了方便快捷,你就找个劳务中心让他们帮你找瓦匠,你会和劳务中心沟通就可以了。(使用QThread线程管理类)

方法I:继承Qthred

//WorkerThread.h
#ifndef _WORKERTHREAD_
#define _WORKERTHREAD_
#include <QThread>class WorkerThread : public QThread
{Q_OBJECTpublic:explicit WorkerThread ();~WorkerThread ();void stop();signals:void progress(const int value);private:void    run();    //虚函数
private:bool    m_stopFlag;
};#endif

你需要把线程的执行代码写到管理类的run函数内,线程会回调run函数。
就像你和劳务中心签合同,合同上有一栏是写瓦匠的工作内容(执行代码)一样

//WorkerThread.cpp
void WorkerThread::WorkerThread(): QThread(), m_stopFlag(false)
{}void WorkerThread::~WorkerThread()
{}void WorkerThread::stop()
{m_stopFlag = true;this->quit();this->wait();
}void WorkerThread::run()
{//该线程管理类对应的线程实际运行代码位置int value = 0;while (!m_stopFlag) {//do somethingemit progress(value);usleep(100);}
}
//*.cpp
//使用方法//1、声明WorkerThread对象
WorkerThread m_workerThread;//2、在你需要的地方直接调用QThread内部接口start()告知Qt系统帮你干杂七杂八的活
connect(&m_workerThread, SIGNAL(progress(int)), SLOT(slot_progress(int)));
m_workerThread.start();//3、结束后记得让Qt系统帮你擦干净屁股
m_workerThread.stop();

加m_stopFlag可以让瓦匠一直工作,直到你觉得合格为止(万恶的资本主义社会),你觉得可以结束了,就调用stop结束即可。

下述是对stop函数详细说明

 this->quit();

因为是Qt劳务中心,结束要先告知劳务中心结束合同(退出事件循环)

this->wait();

你需要等瓦匠收工,打扫干净地面,才能回到自己家里
该接口堵塞直到超时或者线程执行完退出,同 pthread_join()。

最后一点你需要清楚,m_workerThread的全部接口,若你直接调用,实际上还是在GUI线程内(是你定义声明的线程 )运行。只有通过start() 让对应的线程回调run接口才是在其线程内运行。所以若有关键变量需要加锁。

方法II:move to thread

 4.8版本之后官方推荐该方法,不知道为什么,其实都是一样的,写法不一样而已。

来看官方Demo

 class Worker : public QObject{Q_OBJECTQThread workerThread;public slots:void doWork(const QString &parameter) {// ...emit resultReady(result);}signals:void resultReady(const QString &result);};class Controller : public QObject{Q_OBJECTQThread workerThread;public:Controller() {Worker *worker = new Worker;worker->moveToThread(&workerThread);connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString)));workerThread.start();}~Controller() {workerThread.quit();workerThread.wait();}public slots:void handleResults(const QString &);signals:void operate(const QString &);};

QObject对象都有个moveToThread接口,可以把自己推送到Qthread内,其实就是给了权限,还可以正常调用worker的函数接口。
对应线程的回调函数是通过信号与槽技术传递到Qt系统内
connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));
资源回收等也是通过类似技术。
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));

这点其实很重要,若采样方法I没有处理好资源释放,可能会导致在事件循环结束之前(每一个Qt线程都有事件循环队列)释放了相关资源,导致Qt程序崩溃。

QThread线程详细用法相关推荐

  1. PyQt5之QThread线程模块

    PyQt5之QThread线程模块 版权声明:版权没有,转载随意 https://blog.csdn.net/MAOZEXIJR/article/details/80983337 一.QThread ...

  2. 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)...

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  3. __declspec关键字详细用法

    __declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...

  4. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

  5. Android命令行工具logcat详细用法!

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明!      本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB ...

  6. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  8. python sort怎么用,Linux Sort命令详细用法(有实例)

    Linux Sort命令详细用法(有实例) sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! Linux sort命令进阶: 1 sort的工作原理 so ...

  9. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn

    vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn 原创ChrisWang_ 最后发布于2019-05-24 10:25:58 阅读数 1332  收藏 展开 vue性 ...

  10. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法

    嘿嘿,今天在论坛里看了一篇帖子,讨论ltrim() 函数的详细用法,下面我借几个高手的回答总结一下: 先看几个实例: SQL> select ltrim('109224323','109') f ...

最新文章

  1. 如何让自己的开源库支持cocoapods?
  2. gdal进行遥感影像读写_如何使用遥感影像进行矿物勘探
  3. 31-- 二叉搜索树的范围和
  4. maven package install deploy区别
  5. 使用Github发布自己的网站
  6. python车牌识别系统开源代码_python实现车牌识别的示例代码
  7. 小甲鱼python课后题和答案简书_小甲鱼Python入门 10讲 答案
  8. DIAView 嵌入视频监控(海康威视)
  9. 兴东机器人_福州市松下机器人维保中心
  10. Python爬虫案例:下载酷某音乐文件
  11. 降噪和变声的几个常用软件简单整理
  12. MATLAB图像处理边缘检测
  13. [禅悟人生]生活中的烦恼, 一笑了之
  14. 如何查看本地服务器名称
  15. 解析几何 曲线与二次曲面 曲面方程与坐标变换(2.1,2.2)
  16. 单片机list文件解析及 hardfalt问题定位
  17. mysql 索引(2)(索引失效的问题及解决)
  18. python图片拼合
  19. IIS 支持 flv文件播放 (浏览器中可打开一flv文件)
  20. 蓝桥杯-【交换瓶子】【2016年省赛B组题解】【C++】

热门文章

  1. Android布局详解之一:FrameLayout
  2. Lrc2srt精灵,增加自定义输出编码
  3. 文件系统 -- 磁盘基础知识和FAT32文件系统详细介绍
  4. Win8快捷键的使用
  5. 百度云同盘在计算机显示不出来的,电脑打不开百度网盘里面的视频如何解决
  6. 自己动手写网络爬虫-----(1)
  7. 用C++写一个简单的表白小程序
  8. 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
  9. Flash视频播放器开发经验总结
  10. 禁用计算机f1-f12,win10系统禁用f1-f12快捷键的操作方法