QT从入门到入土(四)——多线程(QtConcurrent::run())

引言

在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)——多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com)

但是最近在做项目时候,要将一个函数单独运行在另一个线程中,并且这个函数是私有函数,用到的数据也是私有数据,不能通过其他类访问,这样怎么办?如何在Qt中的当前类创建线程?


最简单的多线程QtConcurrent::run()

  • 其函数原型如下:
QFuture<T> QtConcurrent::run(Function function, ...)
QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...)

参数function需要外部函数:(或者lambda函数),后面也可跟外部函数的参数。

extern void func(QString str);

QtConcurrent :: run()也接受指向成员函数的指针。第一个参数必须是一个const引用或一个指向该类实例的指针。const成员函数一般传递 常量引用 (const reference),而非常量成员函数一般传递 指针 (pointer)

  • 在VS环境中需要引用: #include"QtConcurrent/qtconcurrentrun.h"

简单的说,QtConcurrent::run()函数会在一个单独的线程中执行,并且该线程取自全局QThreadPool,该函数的返回值通过QFuture API提供。
请注意:该函数可能不会立即运行; 函数只有在线程可用时才会运行。通过QtConcurrent::run()返回的QFuture不支持取消、暂停,返回的QFuture只能用于查询函数的运行/完成状态和返回值。

  • 实例:实现多线程耗时操作(调用成员函数)

在主程序threadtest.h中声明成员函数(并添加引用)

#include <QtWidgets/QMainWindow>
#include "ui_threadtest.h"
#include"workThread.h"
#include"qthread.h"
#include"QtConcurrent/qtconcurrentrun.h"//QtConcurrent引用
#pragma execution_character_set("utf-8")
class Threadtest : public QMainWindow
{
Q_OBJECT public:
Threadtest(QWidget *parent = Q_NULLPTR);
private:
Ui::ThreadtestClass ui;
void work();//成员函数
};

在主程序threadtest.cpp中调用成员函数

#include "threadtest.h"
#include"qdebug.h" Threadtest::Threadtest(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.btn_start, &QPushButton::clicked, [=]()
{
//将成员函数放入参数中(成员函数需要引用指针)
QtConcurrent::run(this, &Threadtest::work);
});
}
void Threadtest::work()
{
qDebug() << "子线程运行:" << QThread::currentThreadId();
QThread::sleep(5);
qDebug() << "子线程结束:" << QThread::currentThreadId();
}

点击按钮即可触发子线程运行。

QT从入门到入土(四)——多线程(QtConcurrent::run())

  • 实例:实现多线程耗时操作(调用外部函数,带参数)

在主程序threadtest.h中声明外部函数

#include <QtWidgets/QMainWindow>
#include "ui_threadtest.h"
#include"workThread.h"
#include"qthread.h"
#include"QtConcurrent/qtconcurrentrun.h"//QtConcurrent引用
#pragma execution_character_set("utf-8")
class Threadtest : public QMainWindow
{
Q_OBJECT public:
Threadtest(QWidget *parent = Q_NULLPTR);
private:
Ui::ThreadtestClass ui; };
extern void func(QString str);//外部函数

在主程序threadtest.cpp中调用外部函数

#include "threadtest.h"
#include"qdebug.h" Threadtest::Threadtest(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.btn_start, &QPushButton::clicked, [=]()
{
QtConcurrent::run(func,QString("extern"));
});
}
void func(QString str)
{
qDebug() << "子线程运行:" << QThread::currentThreadId()<< str;
QThread::sleep(5);
qDebug() << "子线程结束:" << QThread::currentThreadId()<< str;
}

QT从入门到入土(四)——多线程(QtConcurrent::run())

上一篇:QT从入门到入土(三)——信号和槽机制


下一篇:开机时进入 grub rescue>的解决方法