Qt之QtConcurrent
本⽂以 Qt 中的 QtConcurrent::run() 函数为例,介绍如何将函数运⾏在单独的线程中。
1  QtConcurrent::run()
QtConcurrent 是命名空间 (namespace),它提供了⾼层次的函数接⼝ (APIs),使所写程序,可根据计算机的 CPU 核数,⾃动调整运⾏的线程数⽬。
下⾯是 Qt 例程runfunction,对应⽬录为D:\Qt\Qt5.12.3\Examples\Qt-5.12.3\qtconcurrent\runfucntion
1.1  .pro ⼯程⽂件
使⽤ QtConcurrent 模块,需要在 .pro 中添加:QT += concurrent
QT += concurrent widgets
CONFIG += console
SOURCES += main.cpp 
1.2  main.cpptrunc函数怎么样
#include <QString>
#include <QDebug>
#include <QThread>
#include <QApplication>
#include "qtconcurrentrun.h"
using namespace QtConcurrent;
void func(QString name)
{
qDebug() << name << "from" << QThread::currentThread();
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QFuture<void> fut1 = run(func, QString("Thread 1"));
QFuture<void> fut2 = run(func, QString("Thread 2"));
fut1.waitForFinished();
fut2.waitForFinished();
⽤ QtConcurrent::run() 函数,分别将  func() 运⾏在两个不同的线程中,输出结果如下:
"Thread 1" from QThread(0x1b74fd2ebc0, name = "Thread (pooled)")
"Thread 2" from QThread(0x1b74fd534e0, name = "Thread (pooled)")
下⾯是 QtConcurrent::run() 的详细使⽤,阅读完 2 和 3,再看上⾯的 runfunction 例程,就容易理解了。
2  普通函数
2.1  将函数运⾏在某⼀个线程中
extern void func();
QFuture<void> future = QtConcurrent::run(func); 
如果要为其指定线程池,可以将线程池的指针作为第⼀个参数传递进去
extern void func();
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, func); 
2.2  向该函数传递参数
需要传递的参数,则跟在函数名之后,依次加⼊
extern void FuncWithArguments(int arg1, const QString &string);
int integer = ...;
QString string = ...;
QFuture<void> future = QtConcurrent::run(FuncWithArguments,integer,string); 
2.3  获取该函数的计算结果
extern QString Func(const QByteArray &input);
QByteArray byte_array = ...;
QFuture<QString> future = QtConcurrent::run(func, byte_array);
...
QString result = sult();
3  成员函数
将类中的成员函数运⾏在某⼀个线程中,可将指向该类实例的引⽤或指针作为 QtConcurrent::run 的第
⼀个参数传递进去,常量成员函数⼀般传递常量引⽤ (const reference),⽽⾮常量成员函数⼀般传递指针(pointer)
3.1  常量成员函数
在⼀个单独的线程中,调⽤QByteArray 的常量成员函数split(),传递给 run() 函数的参数是bytearray
QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
...
QList<QByteArray> result = sult(); 
3.2  ⾮常量成员函数
在⼀个单独的线程中,调⽤QImage 的⾮常量成员函数 invertPixels(),传递给 run() 函数的参数是&image
QImage image = ...;
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
...
future.waitForFinished();
// At this point, the pixels in 'image' have been inverted 
参考资料:
Qt Assistant | Qt 5.12 | Qt Concurrent | Concurrent Run

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。