理论
Qt Concurrent模块包含支持并发执行程序代码的功能。
Qt Concurrent 命名空间提供高层次的API,使人们有可能不写使用低级线程原语的多线程程序,如互斥,读写锁,等待条件或信号。
Qt Concurrent模块扩展了Qt Core模块中提供的基本线程支持,并简化了可在所有可用CPU内核上并行执行的代码的开发。
Qt Concurrent编写的程序会根据可用的处理器内核数自动调整使用的线程数。这意味着今天编写的应用程序将来在将来部署到多核系统上时将继续扩展。
Qt Concurrent包括用于并行列表处理的功能性编程样式API,包括用于共享内存(非分布式)系统的MapReduce和FilterReduce实现,以及用于在GUI应用程序中管理异步计算的类:
- 并发映射和Map-Reduce
- QtConcurrent :: map()将函数应用于容器中的每个项目,就地修改这些项目。
- QtConcurrent :: mapped()类似于map(),不同之处在于它返回带有修改的新容器。
- QtConcurrent :: mappedReduced()类似于mapping(),不同之处在于修改后的结果被缩小或折叠为单个结果。
- 并发过滤和减少过滤
- QtConcurrent :: filter()根据过滤器功能的结果从容器中删除所有项目。
- QtConcurrent :: filtered()类似于filter(),不同之处在于它返回带有过滤结果的新容器。
- QtConcurrent :: filteredReduced()类似于filtered(),不同之处在于将过滤后的结果减少或折叠为单个结果。
- 并发运行
- QtConcurrent :: run()在另一个线程中运行一个函数。
- QFuture表示异步计算的结果。
- QFutureIterator允许迭代通过QFuture可获得的结果。
- QFutureWatcher允许使用信号和插槽监视QFuture。
- QFutureSynchronizer是一个便利类,可自动同步多个QFuture。
Qt Concurrent支持几种兼容STL的容器和迭代器类型,但最适合具有随机访问迭代器的Qt容器,例如QList或QVector。映射和过滤器函数接受容器和开始/结束迭代器。
STL迭代器支持概述:
迭代器类型 | 示例类 | 支持状态 |
---|---|---|
输入迭代器 | 不支持 | |
输出迭代器 | 不支持 | |
正向迭代器 | std :: slist | 支持的 |
双向迭代器 | QLinkedList,std :: list | 支持的 |
随机访问迭代器 | QList,QVector,std :: vector | 支持和推荐 |
在Qt Concurrent对大量轻量级项目进行迭代的情况下,随机访问迭代器可以更快,因为它们允许跳转到容器中的任何点。另外,使用随机访问迭代器允许Qt Concurrent通过QFuture :: progressValue()和QFutureWatcher :: progressValueChanged()提供进度信息。
调用时,非原位修改函数(例如,mapped()和filtered())会复制容器。如果您使用的是STL容器,则此复制操作可能会花费一些时间,在这种情况下,我们建议改为指定容器的开始和结束迭代器。
实践
1、QT += concurrent
2、
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QtConcurrent>
void printMes(QString mes)
{
qDebug()<<"pprintMes thread : "<<QThread::currentThreadId();
qDebug()<<mes;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"mainthread :"<<QThread::currentThreadId();
QString mes = "hello world";
QtConcurrent::run(printMes,mes);
return a.exec();
}