c语言qt多线程的实现方式,Qt多线程即写即用QThread实现方法

本文介绍了如何在Qt中使用moveToThread()函数和信号槽机制实现多线程,而不是通过继承QThread。详细步骤包括创建QThread和工作类Worker,将Worker移到新线程并连接信号与槽,实现在主线程外执行耗时操作,最后展示了运行效果和源代码下载链接。
摘要由CSDN通过智能技术生成

本文所介绍的这种Qt的线程用法在Qt的官方文档中有类似介绍,这里给出一个完整的示例共读者参考。本文介绍的这种方法,并不是常见的通过继承QThread,重写run()函数来实现Qt多线程,而是通过moveToThread(QThread * thread)函数将工作类对象移到所创建的QThread对象中去执行。本方法巧妙的利用了Qt信号和槽机制。

基本思想

在主线程中,哪里需用多线程,就在哪里创建一个QThread实例;

把耗时操作封装到一个继承于QObject的子类(这里叫做工作类Worker)槽函数中;

创建QThread实例和Worker实例,建立他们之间的信号和槽关系;

调用Worker实例的moveToThread(QThread * thread)函数,将它移动到创建的QThread线程中去;

最后,执行QThread线程的start()方法。

工作类

worker.h

#ifndef WORKER_H

#define WORKER_H

#include

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

#include

Worker::Worker(QObject *parent) : QObject(parent)

{

}

void Worker::doLongTimeWork()

{

qDebug()<<__line__ enter>

qint64 count = 100;

while(count--){

QThread::msleep(10);

qDebug()<<__line__>

}

emit complete();

qDebug()<<__line__ 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();

}

运行效果

a2d4bbea3822?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

运行效果.png

源代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值