参考文章:C++/Qt 多线程
一、Concurrent::run多线程
1、设置打开
打开QT Project Setting

点击Qt Modules

把Concurrent打钩

2、代码
输入头文件
#include <QtConcurrent>
使用
//QFuture<T> QtConcurrent::run(Function function, ...)
QString str = "test";
QFuture<void> fun_res1 = QtConcurrent::run(fun1,str)
//QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...)
QFuture<void> fun_res2 = QtConcurrent::run(this, &MainFrameUi::fun2, str)
二、 moveToThread实现多线程
1、简介
此类多线程由QObject类提供
官方描述
moveToThread (QThread * targetThread)
//Changes the thread affinity for this object and its children. The object cannot be moved if it has a parent. Event processing will continue in the targetThread.
更改此对象及其子对象的线程亲和类型。如果对象具有父对象,则不能移动该对象。事件处理将在 targetThread 中继续。
2、建立Worker类
此类是用于定义线程需要做的费时工作,此类重点在于定义
doWork()槽函数,其执行是就是子线程执行。
Worker.h文件
#pragma once
#include <qobject.h>
#include <qthread.h>
#include <qdebug.h> //用于打印输出信息
class Worker:public QObject{
Q_OBJECT
public:
explicit Worker(QObject* parent = nullptr);
public slots:
void doWork(int parameter);//// doWork 定义线程要执行的操作
signals:
void resultReady(const int result);// 线程完成工作时发送的信号
};
Worker.cpp文件
#include "Worker.h"
Worker::Worker(QObject* parent){
}
void Worker::doWork(int parameter){
qDebug() << "receive the execute signal";
qDebug() << "\tCurrent thread ID: " << QThread::currentThreadId();
for (int i = 0; i != 1000000; ++i)// 循环
++parameter;
qDebug() << "\tFinish the work and sent the result Ready signal\n";// 发送结束信号
emit resultReady(parameter);
}
doWork()槽函数是用来写费时的函数主体,并交给子线程运行
3、建立Controller类
此类是使用多线程的主体类,可不用建,直接在程序主体中实现此类的功能就行
Controller.h文件
#pragma once
#include "Worker.h"
// controller 用于 启动子线程 和 处理子线程执行的结果
class Controller:public QObject{
Q_OBJECT
QThread workerThread;
public:
explicit Controller(QObject* parent = nullptr);
~Controller() override;
public slots:
static void handleResults(int result);// 处理子线程执行的结果
signals:
void operate(const int);// 发送信号,触发线程
};
Controller.cpp文件
Controller::Controller(QObject* parent) : QObject(parent)
{
auto* worker = new Worker;
// 调用 moveToThread 将该任务交给 workThread
worker->moveToThread(&workerThread);
// operate 信号发射后启动线程工作
connect(this, SIGNAL(operate(const int)), worker, SLOT(doWork(int)));
// 该线程结束时销毁
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
// 线程结束后发送信号,对结果进行处理
connect(worker, SIGNAL(resultReady(int)), this, SLOT(handleResults(int)));
// 启动线程
workerThread.start();
// 发射信号,开始执行
qDebug() << "emit the signal to execute!";
qDebug() << "\tCurrent thread ID:" << QThread::currentThreadId() << '\n';
emit operate(0);
}
其构造函数中创建 worker 对象,并且将其事件循环全部交给 workerThread 对象来处理,最后启动该线程,然后触发其事件处理函数
Controller::~Controller()
{
workerThread.quit();
workerThread.wait();
}
析构函数中调用 quit() 函数结束线程

1251

被折叠的 条评论
为什么被折叠?



