QtConcurrent是Qt框架中用于简化多线程编程的一个模块,它提供了高层次的API来实现并行计算,而不需要开发者直接管理线程的创建、调度和销毁。QtConcurrent主要通过QFuture和QThreadPool来进行并发任务的执行。
使用QtConcurrent的主要优点:
自动利用系统的所有处理器核心,提高计算密集型任务的执行效率。
不需直接操作线程,降低了多线程编程的复杂度和出错概率。
提供了阻塞和非阻塞两种模式,通过QFuture和QFutureWatcher进行结果的获取和回调通知。
QtConcurrent的常用API:
-
QtConcurrent::run():执行一个函数或Lambda表达式,并返回一个QFuture,可以用于获取执行结果或监视执行状态。
-
QtConcurrent::mapped() / mappedReduced():并行地对容器中的所有元素应用一个映射函数,返回映射后的结果集合或聚合结果。
-
QtConcurrent::filtered():过滤容器中的元素,保留满足给定条件的元素。
-
QtConcurrent::blockingMap() / blockingFiltered():阻塞版本的并行映射和过滤操作,直到所有任务完成。
QtConcurrent的使用示例:
#include <QtWidgets>
#include <QtConcurrent>
// 定义一个计算密集型函数
int computeValue(int number) {
QThread::sleep(1); // 模拟耗时计算
return number * number;
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 使用QtConcurrent::run()并行执行函数
QList<int> numbersToCompute {1, 2, 3, 4, 5};
QList<QFuture<int>> futures;
foreach (int number, numbersToCompute) {
futures.append(QtConcurrent::run(computeValue, number));
}
// 输出结果
for (auto &future : futures) {
qDebug() << "Computed result:" << future.result();
}
// 或者使用QFutureWatcher进行异步通知
QFutureWatcher<int> watcher;
QFuture<int> future = QtConcurrent::run(computeValue, 10);
connect(&watcher, &QFutureWatcher<int>::finished, [&]() {
qDebug() << "Computed asynchronously:" << watcher.result();
});
watcher.setFuture(future);
// 运行主事件循环
return app.exec();
}
#include "main.moc"
在上述示例中,我们首先定义了一个计算平方的函数computeValue()
。然后使用QtConcurrent::run()
函数将列表中的每个数字传给computeValue()
函数,并得到一系列QFuture
对象。每个QFuture
对象代表一个并行执行的任务,可以使用result()
方法获取计算结果,但这通常是在主线程事件循环中异步完成的。
另外,还展示了如何结合QFutureWatcher
来异步监听一个计算任务的完成,并在任务完成后打印结果。在实际应用中,QtConcurrent
常用于后台执行耗时任务而不阻塞UI线程,保持应用程序的响应性。