QtConcurrent::run函数
![]()
QtConcurrent实际上是一个命名空间
函数原型:
template<typename T> QFuture<T> QtConcurrent::run(Function function, ...)
它还有一个重载函数:
template<typename T> QFuture<T> QtConcurrent::run(QThreadPool * pool,Function function, ...)
这两个函数是模板函数,T可以是任何数据类型,模板类对象QFuture<T>存储function的返回值。
例如:
void hello(const QString &name);
QFuture<void> f1 = QtConcurrent::run(hello,"123");
函数hello没有返回值,对应就是QFuture<void>;
如果函数hello返回值是QString,对应就是QFuture<QString>;
(1)QtConcurrent::run(function, ...)
(2)QtConcurrent::run(QThreadPool::globalInstance(), function, ...);上面的两种写法是等价的,也就是说,如果使用(1),意味着函数是在QThreadPool::globalInstance()这个线程池中找一个线程来执行function.
示例:
#include <QtConcurrent/QtConcurrentRun>
#include <QDebug>void hello(const QString &name)
{//这里可以是耗时的操作或计算qDebug() << "Hello" << name << "from" << QThread::currentThread();
}int main(int argc, char *argv[])
{qDebug() << "Main Thread" << QThread::currentThread();// 在一个单独的线程中调用 hello()QFuture<void> f1 = QtConcurrent::run(hello, QString("Qter"));QFuture<void> f2 = QtConcurrent::run(hello, QString("Pythoner"));// 阻塞调用线程并等待计算完成,确保所有结果可用f1.waitForFinished();f2.waitForFinished();return 0;
}
Main Thread QThread(0x17488080)
Hello "Qter" from QThread(0x1748c940, name = "Thread (pooled)")
Hello "Pythoner" from QThread(0x1748c7a0, name = "Thread (pooled)")
可以看到,出现了三个线程 : 主线程,子线程1,子线程2。
子线程1和子线程2,都来自线程池Thread(pooled)。
等待异步的计算完成。(包括被终止的计算)。也即:一直等待直到isFinished()返回true。