Qt 并行运算高级API QtConcurrent

Qt Concurrent模块扩展了Qt Core模块中的基本线程支持,简化了可以在所有可用的CPU核心上并行执行的代码开发。

一些常用API:

  • Concurrent Map 和 Map-Reduce

QtConcurrent::map():将一个函数应用于一个容器中的每一项,就地修改 items。

QtConcurrent::mapped():和 map() 类似,只是它返回一个包含修改内容的新容器。

QtConcurrent::mappedReduced():和 mapped() 类似,只是修改后的结果减少或组合 成一个单一的结果。

  • Concurrent Filter 和 Filter-Reduce

QtConcurrent::filter():从容器中删除所有满足某个条件的item。

QtConcurrent::filtered():和 filter() 类似,只是它返回一个包含过滤内容的新容器。

QtConcurrent::filteredReduced():和 filtered() 类似,只是过滤后的结果减少或组合成一个单一的结果。

  • Concurrent Run

QtConcurrent::run():在另一个线程中运行一个函数。

QFuture:表示异步计算的结果

QFutureIterator:允许通过 QFuture 遍历可用的结果

QFutureWatcher:允许使用信号槽来监控一个 QFuture

QFutureSynchronizer:是一个方便的类,用于一些 QFutures 的自动同步

Qt Concurrent 支持多种兼容 STL 的容器和迭代器类型,但是最好使用具有随机访问迭代器的 Qt 容器,例如:QList 或 QVector。map 和 filter 函数都接受容器和 begin/end 迭代器。

在 Qt Concurrent 迭代大量轻量级 items 的情况下,随机访问迭代器可以更快,因为它们允许跳过容器中的任何点。此外,使用随机访问迭代器允许 Qt Concurrent 通过 QFuture::progressValue() 和 QFutureWatcher::progressValueChanged() 来提供进度信息。

非就地修改的函数(例如:mapped() 和 filtered()),在调用时会创建容器的副本。如果正在使用的是 STL 容器,此复制操作可能需要一段时间,在这种情况下,建议为容器指定 begin 和 end 迭代器。

Concurrent Map 和 Map-Reduce示例:

 1 void add(int &num)
 2 {
 3     num +=1;
 4 }
 5 
 6 int mappedReducedFunction(const int& num)
 7 {
 8     return num + 1;
 9 }
10 
11 void ReduceFunction(int& result, const int& item)
12 {
13     result = item > result ? item : result;
14 }
15 
16 {
17     QVector<int> vector;
18 
19     for(int i=0; i<3; i++)
20        vector.append(i);
21 
22     qDebug() << "start: " << vector;
23 
24     QFuture<void> vFuture = QtConcurrent::map(vector, add);
25     vFuture.waitForFinished();
26 
27     qDebug() << "map result: " << vector;
28 
29     QFuture<int> iFuture = QtConcurrent::mappedReduced(vector, mappedReducedFunction, ReduceFunction);
30 
31     qDebug() << "mappedReduced result: " << iFuture.result();
32 }

结果输出:

start: QVector(0, 1, 2)
map result: QVector(1, 2, 3)
mappedReduced result: 4

QtConcurrent::mappedReduced() 类似于 QtConcurrent::mapped(),但是不是返回具有新结果的序列,而是使用 reduce 函数将结果组合成单个值。

reduce 函数必须是以下形式:

V function(T &result, const U &intermediate)

T 是最终结果的类型,U 是 map 函数的返回类型。注意: reduce 函数的返回值、返回类型没有被使用。

对于 map 函数返回的每个结果,reduce 函数将被调用一次,并且应该将中间体合并到结果变量中。QtConcurrent::mappedReduced() 保证一次只有一个线程调用 reduce,所以没有必要用一个 mutex 锁定结果变量。

QtConcurrent::ReduceOptions 枚举提供了一种方法来控制 reduction 完成的顺序。如果使用 QtConcurrent::UnorderedReduce(默认),顺序是不确定的;而 QtConcurrent::OrderedReduce 确保 reduction 按照原始序列的顺序完成。

Concurrent Filter Filter-Reduce 与 Concurrent Map Map-Reduce 使用基本一致。

QtConcurrent::run() 函数在一个单独的线程中运行一个函数, 函数的返回值通过 QFuture API 提供。

Concurrent Run示例:

 1 int add(int &num)
 2 {
 3      return ++num;
 4 }
 5 
 6 {
 7     QFuture<int> future = QtConcurrent::run(add, 1);
 8     future.waitForFinished();
 9 
10     qDebug() << "result: " << future.result();
11 }

结果输出:

result: 2

上述两个示例中,我们都是QFuture阻塞线程等待计算完成;QFuture 还提供了很多方法与正在进行的异步调用进行交互。例如,使用 cancel() 函数取消计算;要暂停计算,使用 setPaused() 函数或 pause(),resume()、togglePaused() 便利函数之一。

注意:并非所有异步计算都可以取消或暂停。例如,QtConcurrent::run() 返回的 future 不能被取消,但 QtConcurrent::mappedReduced() 返回的可以。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
<p> 本课程详细、全面地介绍了 Qt 开发中的各个技术细节,并且额外赠送在嵌入式端编写Qt程序的技巧。整个课程涵盖知识点非常多,知识模块囊括 Qt-Core 组件、QWidgets、多媒体、网络、绘图、数据库,超过200个 C++ 类的分析和使用,学完之后将拥有 Qt 图形界面开发的非常坚实的功底。  </p> <p> <br /></p> <p> 每个知识点不仅仅会通过视频讲解清楚,并且会配以精心安排的实验和作业,用来保证学习过程中切实掌握核心技术和概念,通过实验来巩固,通过实验来检验,实验与作业的目的是发现问题,发现技术盲点,通过答疑和沟通夯实技术技能。 </p> <p> <br /></p> <p> <span style="color:#E53333;"><strong>注意</strong></span>:本套视频教程来源于线下的实体班级,因此视频中有少量场景对话和学生问答,对此比较介意的亲们谨慎购买。 </p> <p> <img src="https://img-bss.csdnimg.cn/202006111209386420.jpg" alt="" /></p> <p> <br /></p> <p> <span style="color:#E53333;"><strong>注意</strong></span>:本套视频教程包含大量课堂源码,包含对应每个知识点的精心编排的作业。由于CSDN官方规定在课程介绍中不能出现作者的联系方式,因此在这里无法直接给出QQ答疑号,视频中的源码、资料和作业文档链接统一在购买后从CSDN平台跟我沟通,我会及时回复跟进。 </p> <p> <br /></p> <p> <strong><span style="color:#E53333;">注意</span></strong>:本套视频教程包含全套10套作业题,覆盖所有视频知识点,循序渐进,各个击破,作业总纲如下: </p> <p> <img src="https://img-bss.csdnimg.cn/202006111337059806.jpg" alt="" /></p> <p> <br /></p> <p> <br /></p> <p> </p><p style="font-size:16px;"> <span style="color:#3A4151;">下面是部分作业题目展示,每道题都有知识点说明,是检验学习效果的一大利器:</span> </p> <p style="font-size:16px;"> <span style="color:#3A4151;"><span style="font-size:16px;">(部分作业展示,为了防止盗图盗题对题干做了模糊处理)</span></span> </p> <p style="font-size:16px;"> <span style="color:#3A4151;"><img src="https://img-bss.csdnimg.cn/202006121455228969.jpg" alt="" /><br /></span> </p> <p style="font-size:16px;"> <span style="color:#3A4151;"><br /></span> </p> <p style="font-size:16px;"> (部分作业展示,为了防止盗图盗题对题干做了模糊处理) </p> <p> <img src="https://img-bss.csdnimg.cn/202006121448525610.jpg" alt="" /></p> <p> <br /></p> <p> <span style="font-size:16px;">(部分作业展示,为了防止盗图盗题对题干做了模糊处理)</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202006121450392202.jpg" alt="" /></p> <p> <br /></p> <p> <span style="font-size:16px;">(部分作业展示,为了防止盗图盗题对题干做了模糊处理)</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202006121450547079.jpg" alt="" /></p> <p> <br /></p> <p> <span style="font-size:16px;">(部分作业展示,为了防止盗图盗题对题干做了模糊处理)</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202006121455494156.jpg" alt="" /></p> <p> …… …… </p>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

十年编程老舅

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值