Qt项目第四弹-多线程调用

常见的多线程实现方式

  • 继承自QThread类并重载run函数

具体实现时,可以创建一个继承自QThread的类,并在该类中重载run函数。在run函数中编写需要在线程中执行的代码。需要注意的是,使用这种方式时,run函数中的代码不会自动运行在子线程中,需要调用start()方法来启动线程。

  • 使用moveToThread方法

将需要执行的任务封装到一个类中,然后将该类移动到一个QThread对象中。首先,需要创建一个继承自QObject的类,并将需要执行的任务定义为该类中的槽函数。然后,将该类移动到一个QThread对象中,并调用start()方法来启动线程。在槽函数被调用时,就会自动在线程中执行相应的任务。

  • 本文自然是不对老生常谈的方式再次进行介绍,这里给大家讲解一种更简单的新方式QtConcurrent

QtConcurrent

  • 第一步,项目配置文件引入依赖
QT       += concurrent
  • 第二步,当然是可以直接调用了
#include "test.h"
/**
    *  @Brief:      qtconcurrent依赖头文件
    *  @Author:     springIce
    *  @Date:       2024-02-02
    **/
#include 
#include 

Test::Test(QObject *parent)
    : QObject{parent}
{
}

void Test::setName(const QString &name)
{
    QtConcurrent::run([=](){
        qDebug() << "子线程ID:" << QThread::currentThreadId();
    });
}
  • 实际效果如下
    在这里插入图片描述

是不是十分简单,只要把想在线程中执行的逻辑写在函数中,让QtConcurrent跑起来就搞定了

  • 除上述使用lambda外,QtConcurrent调用函数的基本方式如下:
//方式一
	QtConcurrent::run([=](){
        qDebug() << "子线程ID:" << QThread::currentThreadId();
    });
//方式二
    QtConcurrent::run(this, &Test::threadDo);
//方式三
    QString value = "Hello";
    QtConcurrent::run(this, &Test::threadDo, value);

需要获取线程的状态借助QFtureWatcher

#include "test.h"

/**
    *  @Brief:      qtconcurrent依赖头文件
    *  @Author:     springIce
    *  @Date:       2024-02-02
    **/
#include 
#include 
#include 
#include 

Test::Test(QObject *parent)
    : QObject{parent}
{
}

void Test::setName(const QString &name)
{
    QFutureWatcher<int> watcher;
    connect(&watcher, SIGNAL(finished()), this, SLOT(handleFinished()));
    QFuture<int> future = QtConcurrent::run(this, &Test::threadDo);
    watcher.setFuture(future);
}

void Test::handleFinished()
{

}

int Test::threadDo()
{
    return 0;
}

以上仅为简单实例,可根据实际情况修改函数逻辑,也可对返回值进行包装struct。相信多线程的使用一定会使你的项目运转更加快速,但是多线程要更加注意信号槽的触发。

你可能感兴趣的:(qt,开发语言)