Qt 多线程QThread实现方法之一

基本思想

  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 = 0);
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 = 100;
    while(count--){
        QThread::msleep(10);
        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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值