VS +QT多线程学习

参考文章:C++/Qt 多线程

一、Concurrent::run多线程

1、设置打开

打开QT Project Setting

QT

点击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() 函数结束线程

参考

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值