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(); }
点击按钮即可触发子线程运行。
- 实例:实现多线程耗时操作(调用外部函数,带参数)
在主程序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; }