Qt 并行运算高级API QtConcurrent
admin
2024-03-25 03:29:44
0

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 vector;
18 
19     for(int i=0; i<3; i++)
20        vector.append(i);
21 
22     qDebug() << "start: " << vector;
23 
24     QFuture vFuture = QtConcurrent::map(vector, add);
25     vFuture.waitForFinished();
26 
27     qDebug() << "map result: " << vector;
28 
29     QFuture 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 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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

相关内容

热门资讯

像黄渤他大舅一样搞笑的 像黄渤他大舅一样搞笑的比如黄渤他大舅了还有葛优征婚说的经典台词等等他大舅是谁呀
森屿暖树时光恋人墒以光年深海爱... 森屿暖树时光恋人墒以光年深海爱人 的拼音森屿sen yu暖树nuan shu时光恋人shi guan...
十二星座对应剑灵哪些职业 十二星座对应剑灵哪些职业这样你也能扯到一快去
泡荔枝用什么酒最好呢?选择合适... 近年来,泡荔枝等水果酒的风潮越来越热,不仅能在家轻松制作美味的果酒,还能根据个人口味调整酒的风味。然...
分享3款适合小暑时节的手工甜品... 小暑至,盛夏始。随着气温节节攀升,人体易生内热,出现心烦口渴、食欲不振等症状。此时,一碗清甜解暑的甜...
“贵州省汤”火了!解暑又减脂,... 最近不少地方遭遇持续高温,不少网友表示,在厨房里待十几分钟,浑身都是汗。这种天气下,吃什么,成了很多...
轻盈细腻的澳洲甜点 巴甫洛娃(... 主料:鲜鸡蛋白12个、糖450克 配料:白醋、香草精、玉米淀粉各1汤匙 做法: 1.用打蛋器打发鸡蛋...
西游记中唐僧和猪八戒误喝子母河... 西游记中唐僧和猪八戒误喝子母河水腹痛难忍。泉主人如意真仙为何不给悟空落胎?手机中唐僧和猪八戒,巫师蝎...
学生一般毕业的话,可以第二次进... 学生一般毕业的话,可以第二次进入大学重读吗?首先是一般情况下是不可以的,除非你是准备提升学历考研考博...
小说是一种作家写的假的事什么意... 小说是一种作家写的假的事什么意思?作家写小说,是一个根据真人真事进行艺术加工的过程,并不是完全虚构的...
自称为行者是什么意思? 自称为行者是什么意思?“行者”指的是出家而未经过剃度的佛教徒。自称行者就是说他自己是修行佛道之人。那...
有哪些带不字的四字成语? 有哪些带不字的四字成语?不毛之地 不眠之夜 不明不白 不明真相 不谋而合 不谋私利 不...
赞美女老师的诗句有哪些? 赞美女老师的诗句有哪些? 春蚕到死丝方尽,蜡炬成灰泪始干.----- 李商隐为人性僻耽佳句,语不惊人...
做手工巧克力会花多少钱? 做手工巧克力会花多少钱?那个是跟据你做多大的巧克力来定价的就跟做巧克力蛋糕一样跟据重量算。当地物价不...
中国人为什么很喜欢羽生结弦?他... 中国人为什么很喜欢羽生结弦?他有何特别之处?因为羽生结弦是一位相当阳光帅气的运动员,他特别的善良,热...
爱情伤感文章要有文采! 爱情伤感文章要有文采!不是故事才可以要有文采!11不过,最真实的故事才是最感人的。
真的有‘运气’存在吗 真的有‘运气’存在吗那么人转运是以什么为界限的?是根据自己的生日吗?运气好办事容易成吗从局部看来有,...
古时候月亮升起和落下的地方各叫... 古时候月亮升起和落下的地方各叫什么名字?我知道太阳起在扶桑,落在禺谷,那么月亮呢??我想写篇散文,用...
有没有那种赚钱 布置房子 买家... 有没有那种赚钱 布置房子 买家具的手机游戏?模拟人生合集版女生的话可以玩养成游戏,如爱丽丝梦幻茶话会...
求几本能激励人的书 求几本能激励人的书我虽是城里人,但也是小地方的穷人,正要去大城市工作发展,请问有什么关于这样的励志的...