基本思想

  1. 在主线程中,哪里需用多线程,就在哪里创建一个QThread实例;
  2. 把耗时操作封装到一个继承于QObject的子类(这里叫做工作类Worker)槽函数中;
  3. 创建QThread实例和Worker实例,建立他们之间的信号和槽关系;
  4. 调用Worker实例的moveToThread(QThread * thread)函数,将它移动到创建的QThread线程中去;
  5. 最后,执行QThread线程的start()方法。

工作类

worker.h

 #ifndef WORKER_H
#define WORKER_H
#include <QObject>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = );
signals:
void complete();
public slots:
void doLongTimeWork();//耗时操作
};
#endif // WORKER_H

worker.cpp

 #include "worker.h"
#include <QDebug>
#include <QThread>
Worker::Worker(QObject *parent) : QObject(parent)
{ }
void Worker::doLongTimeWork()
{
qDebug()<<__LINE__<<__FUNCTION__<<" - enter";
qint64 count = ;
while(count--){
QThread::msleep();
qDebug()<<__LINE__<<__FUNCTION__<<"count = "<<count;
}
emit complete();
qDebug()<<__LINE__<<__FUNCTION__<<" - leave";
}

使用方法

 void MainWindow::on_pushButtonDoWork_clicked()
{
Worker* worker = new Worker();
QThread* thread = new QThread();
//当线程启动时,执行Worker类的耗时函数doLongTimeWork()
connect(thread,SIGNAL(started()),worker,SLOT(doLongTimeWork()));
//当耗时函数执行完毕,发出complete()信号时,删除worker实例
connect(worker,SIGNAL(complete()),worker,SLOT(deleteLater()));
//当worker对象实例销毁时,退出线程
connect(worker,SIGNAL(destroyed(QObject*)),thread,SLOT(quit()));
//当线程结束时,销毁线程对象实例
connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
//移动worker对象实例到线程中
worker->moveToThread(thread);
//启动线程
thread->start();
}

Qt 多线程QThread实现方法之一的更多相关文章

  1. 解析Qt中QThread使用方法

    本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...

  2. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  3. [ PyQt入门教程 ] PyQt5中多线程模块QThread使用方法

    本文主要讲解使用多线程模块QThread解决PyQt界面程序唉执行耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题.用户使用工具过程中出现这些问题时会误以为程序出错,从而把程序关闭.这样 ...

  4. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

  5. Qt多线程-总结QThread-QThreadPool-QtConcurrent

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent     本文 ...

  6. Qt之QThread(深入理解)

    简述 为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程.对于耗时操作如果不使用线程,UI界面将会长时间处于停滞状态,这种情况是用户非常不愿意看到的,我们可以用线程来解决这个问题. 前面,已 ...

  7. [转] Qt 多线程学习

    Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...

  8. Qt多线程-QThreadPool线程池与QRunnable

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable     本文地址:https:/ ...

  9. Qt 多线程同步与通信

    Qt 多线程同步与通信 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWrite ...

随机推荐

  1. 视觉slam十四讲个人理解(ch7视觉里程计1)

    参考博文::https://blog.csdn.net/david_han008/article/details/53560736 https://blog.csdn.net/n66040927/ar ...

  2. JavaScript—面向对象贪吃蛇_1

    前面说了.面向对象的思考方式和面向过程的思考方式有着本质的区别. 贪吃蛇.作为各大培训机构.面向对象的练手项目,的确好.我昨天看完视频,有一种领悟面向对象的感觉,当然可能只针对贪吃蛇..要想在实际开发 ...

  3. windows 安装svn 要点(非安装步骤)

      http://www.visualsvn.com/files/VisualSVN-Server-2.5.6.msi 下载服务端 windows2008搭建svn 1.360软件管家下载 Visua ...

  4. dfs--八皇后问题

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合法的放置方法. 因为我们 ...

  5. JNI的第2种写法:本地方法注册

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 孔乙己说,茴香豆的茴有四种写法,今天谈谈JNI的第2种写法:本地方法注册. 这种写法的好处是不需要使用ja ...

  6. Ambiguous HTTP method Actions require an explicit HttpMethod binding for Swagger 2.0 异常

    网上看了很多关于此异常的解决方案,但是大多数都是不能用的,今天把正确的解决方案记录下来,以帮助需要的人 问题:有些接口没有设置HttpPost或HttpGet,非接口设置访问权限为private,控制 ...

  7. 吴裕雄--天生自然 PHP开发学习:数据库 ODBC

    <html> <body> <?php $conn=odbc_connect('northwind','',''); if (!$conn) { exit("连 ...

  8. LeetCode Input Initial Code

    说明 LeetCode提供的样本输入,显示上是数组Array,而后台的实际测试用例则是树TreeNode,链表ListNode等. 如果你是在页面手撸代码直接提交的,那没什么影响. 如果你是在本地ID ...

  9. sklearn连续型数据离散化

    二值化 设置一个condition,把连续型的数据分类两类.比如Age,大于30,和小于30. from sklearn.preprocessing import Binerize as Ber x ...

  10. Python cannot import name 'Line' from 'pyecharts'

    问题与尝试 代码 from pyecharts.charts import Line 中,出现 cannot import name 'Line' from 'pyecharts' 错误. 找了很多, ...