VS +QT多线程学习

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

一、Concurrent::run多线程

1、设置打开

打开QT Project Setting

VS +QT多线程学习_第1张图片

点击Qt Modules

VS +QT多线程学习_第2张图片

把Concurrent打钩

VS +QT多线程学习_第3张图片

2、代码

输入头文件

#include 

使用

//QFuture QtConcurrent::run(Function function, ...)
QString str = "test";
QFuture<void> fun_res1 = QtConcurrent::run(fun1,str)
//QFuture 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 
#include 
#include  //用于打印输出信息

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

参考

  • QT 中的多线程—moveToThread 篇
  • Qt 多线程之QObject::moveToThread
  • C++/Qt 多线程

你可能感兴趣的:(多线程,VS,QT,qt,学习,c++)