Qt并发
Qt并发模块提供了高级API,使得无需使用诸如互斥锁、读写锁、等待条件或信号量的底层线程原语,即可编写多线程程序。使用Qt并发编写的程序将自动根据可用的处理器核心数调整使用的线程数。这意味着,今天编写的应用程序在部署到未来的多核系统中将继续扩展。
Qt并发包括用于并行列表处理的函数式编程样式API,包括专为共享内存(非分布式)系统设计的MapReduce和FilterReduce实现,以及用于在GUI应用程序中管理异步计算的类。
- 并发Map和Map-Reduce
- QtConcurrent::map()将一个函数应用于容器中的每个项目,就地修改项目。
- QtConcurrent::mapped()类似map(),但是它返回一个新的容器,包含修改结果。
- QtConcurrent::mappedReduced()类似mapped(),但修改结果是合并为单个结果。
- 并发Filter和Filter-Reduce
- QtConcurrent::filter()根据过滤器函数的结果从容器中删除所有项目。
- QtConcurrent::filtered()类似filter(),但是它返回一个新的容器,包含过滤后的结果。
- QtConcurrent::filteredReduced()类似filtered(),但过滤结果是合并为单个结果。
- 并发运行
- QtConcurrent::run()在另一个线程中运行函数。
- 并发任务
- QtConcurrent::task()创建QtConcurrent::QTaskBuilder的实例。该对象可用于调整参数,在单独的线程中启动任务。
- QFuture表示异步计算的结果。
- QFutureIterator允许通过QFuture迭代可用结果。
- QFutureWatcher允许使用信号和槽监控QFuture。
- QFutureSynchronizer是一个便利类,可自动同步多个QFutures。
- QPromise为将异步计算的进度和结果报告给QFuture提供了一种方法。允许在QFuture请求时挂起或取消任务。
Qt并发支持几个与STL兼容的容器和迭代器类型,但最佳性能在与具有随机访问迭代器的Qt容器一起使用,例如QList。Map和filter函数接受容器和begin/end迭代器。
STL迭代器支持概览
迭代器类型 | 示例类 | 支持状态 |
---|---|---|
输入迭代器 | 不支持 | |
输出迭代器 | 不支持 | |
正向迭代器 | std::slist | 支持 |
双向迭代器 | std::list | 支持 |
随机访问迭代器 | QList, std::vector | 支持且推荐 |
在某些情况下,Qt Concurrent对大量轻量级项进行迭代时,随机访问迭代器可以更快,因为它们允许跳转到容器中的任何位置。此外,使用随机访问迭代器还可以通过QFuture::progressValue()和QFutureWatcher::progressValueChanged()提供进度信息。
非就地修改函数(如mapped()和filtered())在调用时会创建容器的一个副本。如果你正在使用STL容器,这个复制操作可能需要一些时间,在这种情况下,我们建议指定容器的开始和结束迭代器。
使用模块
使用Qt模块需要链接到模块库,无论是直接链接还是通过其他依赖。包括CMake和qmake在内的几个构建工具都有专门的支持。
使用CMake进行构建
使用find_package()
命令在Qt6
软件包中查找所需的模块组件
find_package(Qt6 REQUIRED COMPONENTS Concurrent) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
请参阅使用CMake进行构建概述。
使用qmake进行构建
为了使用qmake配置模块来构建,请将模块添加为项目.pro文件中QT
变量的值
QT += concurrent
示例
模块发展
Qt Concurrent 的更改列出了为 Qt 6 系列Qt所做的模块 API 和功能的重要更改。
许可证
Qt Concurrent 模块可以从 Qt 公司 获得商业许可证。此外,它也可在免费软件许可证下获得:GNU Lesser General Public License版本3或GNU General Public License版本2。有关更多信息,请参阅Qt 许可证。
© 2024 Qt 公司有限。本文档中的文档贡献是各自所有者的版权。本文档按自由软件基金会发布的GNU自由文档许可证版本1.3的条款提供。Qt及其相关标志是芬兰的Qt公司及其它国家/地区的商标。所有其他商标均为各自所有者的财产。