常见的多线程实现方式
- 继承自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 <QtConcurrent>
#include <QThread>
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 <QtConcurrent>
#include <QThread>
#include <QFutureWatcher>
#include <QFuture>
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。相信多线程的使用一定会使你的项目运转更加快速,但是多线程要更加注意信号槽的触发。