Qt多线程-QtConcurrent并行运算高级API
本文标题:Qt多线程-QtConcurrent并行运算高级API 本文地址:http://techieliang.com/2017/12/608/
1. 介绍
Qt除了提供基本的QThread实现多线程,并提供QThreadPool实现线程池以外,还提供了QtConcurrent模块用于并行计算。
使用此类需要在pro文件增加QT += concurrent
1.1. API
- void blockingFilter(Sequence &sequence, FilterFunction filterFunction)
- Sequence blockingFiltered(const Sequence &sequence, FilterFunction filterFunction)
- Sequence blockingFiltered(ConstIterator begin, ConstIterator end, FilterFunction filterFunction)
- T blockingFilteredReduced(const Sequence &sequence, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- T blockingFilteredReduced(ConstIterator begin, ConstIterator end, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- void blockingMap(Sequence &sequence, MapFunction function)
- void blockingMap(Iterator begin, Iterator end, MapFunction function)
- T blockingMapped(const Sequence &sequence, MapFunction function)
- T blockingMapped(ConstIterator begin, ConstIterator end, MapFunction function)
- T blockingMappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- T blockingMappedReduced(ConstIterator begin, ConstIterator end, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- QFuture<void> filter(Sequence &sequence, FilterFunction filterFunction)
- QFuture<T> filtered(const Sequence &sequence, FilterFunction filterFunction)
- QFuture<T> filtered(ConstIterator begin, ConstIterator end, FilterFunction filterFunction)
- QFuture<T> filteredReduced(const Sequence &sequence, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- QFuture<T> filteredReduced(ConstIterator begin, ConstIterator end, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- QFuture<void> map(Sequence &sequence, MapFunction function)
- QFuture<void> map(Iterator begin, Iterator end, MapFunction function)
- QFuture<T> mapped(const Sequence &sequence, MapFunction function)
- QFuture<T> mapped(ConstIterator begin, ConstIterator end, MapFunction function)
- QFuture<T> mappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- QFuture<T> mappedReduced(ConstIterator begin, ConstIterator end, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- QFuture<T> run(Function function, ...)
- QFuture<T> run(QThreadPool *pool, Function function, ...)
很多都是重载的,主要函数如下:
- Concurrent Map and Map-Reduce
- QtConcurrent::map() applies a function to every item in a container, modifying the items in-place.
- –这个函数会将作为参数传入的函数应用到容器中的每一项,对这些项进行直接修改,会修改传入变量内容。
- QtConcurrent::mapped() is like map(), except that it returns a new container with the modifications.
- –功能类似于map(),只不过它不是直接修改原始容器,而是将修改后的元素放到一个新的容器中并作为返回值返回。
- QtConcurrent::mappedReduced() is like mapped(), except that the modified results are reduced or folded into a single result.
- –功能类似于mapped(),首先执行mapped的操作,然后传入一个Reduce函数进行简化,最终返回唯一一个元素,此操作不会修改原始容器。
- Concurrent Filter and Filter-Reduce
- QtConcurrent::filter() removes all items from a container based on the result of a filter function.
- –从容器中删除那些满足某个过来条件的项。
- QtConcurrent::filtered() is like filter(), except that it returns a new container with the filtered results.
- –功能类似于filter(),只不过它会返回一个包含剩余元素的容器。
- QtConcurrent::filteredReduced() is like filtered(), except that the filtered results are reduced or folded into a single result.
- –功能类似于filtered(),后续进行reduce操作。
- Concurrent Run
- QtConcurrent::run() runs a function in another thread.
- –用另一个进程运行一个函数
- QFuture represents the result of an asynchronous computation.
- — 获取一步计算结果
- QFutureIterator allows iterating through results available via QFuture.
- –通过使用QFuture允许遍历结果
- QFutureWatcher allows monitoring a QFuture using signals-and-slots.
- — 利用信号槽监视QFuture
- QFutureSynchronizer is a convenience class that automatically synchronizes several QFutures.
- –自动同步多个futures
2. QtConcurrent::map
map的范例:http://doc.qt.io/qt-5/qtconcurrent-map-example.html
map详细介绍:http://doc.qt.io/qt-5/qtconcurrentmap.html
- #include <QCoreApplication>
- #include <QtConcurrent>
- #include <QVector>
- #include <QDebug>
- #include <QFuture>
- void MapFunction(int& num) {
- num += 1;
- }
- int mappedReducedFunction(const int& num) {
- return num + 1;
- }
- void ReduceFunction(int& result, const int& item) {
- int t_r = result;
- result = item > result ? item : result;
- qDebug()<<t_r<<result<<item;
- }
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QVector<int> testVactor;
- for(int i = 1; i <= 3; i++) {
- testVactor.push_back(i);
- }
- for(int i = 1; i <= 3; i++) {
- testVactor.push_back(10-i);
- }
- qDebug() << "start m:" << testVactor;
- QFuture<void> f = QtConcurrent::map(testVactor, MapFunction);
- f.waitForFinished();
- qDebug() << "map result:" << testVactor;//map直接修改源数据
- QFuture<int> r = QtConcurrent::mappedReduced(testVactor, mappedReducedFunction, ReduceFunction);
- qDebug() << "mappedReduced result:" << r.result();
- return 0;
- }
注意几个函数的声明形式,不可有差距。结果
- start m: QVector(1, 2, 3, 9, 8, 7)
- map result: QVector(2, 3, 4, 10, 9, 8)
- 0 3 3
- 3 4 4
- 4 5 5
- 5 11 11
- 11 11 10
- 11 11 9
- mappedReduced result: 11
结果示意很明显,reduced最终表留的是等于函数result参数值的项
3. QtConcurrent::filter
filter详细介绍:http://doc.qt.io/qt-5/qtconcurrentfilter.html
- #include <QCoreApplication>
- #include <QtConcurrent>
- #include <QList>
- #include <QDebug>
- #include <QFuture>
- bool filterFunction(const int& num) {
- return (num > 5);
- }
- void ReduceFunction(int& result, const int& item) {
- int t_r = result;
- result = item > result ? item : result;
- qDebug()<<t_r<<result<<item;
- }
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QList<int> testVactor;
- for(int i = 1; i <= 3; i++) {
- testVactor.push_back(i);
- }
- for(int i = 1; i <= 3; i++) {
- testVactor.push_back(10-i);
- }
- qDebug() << "start m:" << testVactor;
- QFuture<void> f = QtConcurrent::filter(testVactor, filterFunction);
- f.waitForFinished();
- qDebug() << "map result:" << testVactor;//map直接修改源数据
- QFuture<int> r = QtConcurrent::filteredReduced(testVactor, filterFunction, ReduceFunction);
- qDebug() << "mappedReduced result:" << r.result();
- return 0;
- }
注意几个函数的声明形式,不可有差距。filter函数要返回bool类型,用于判断是否过滤此元素
结果:
- start m: (1, 2, 3, 9, 8, 7)
- map result: (9, 8, 7)
- 0 9 9
- 9 9 8
- 9 9 7
- mappedReduced result: 9
4. QtConcurrent::run
感觉run用起来很舒服,因为他没有对运行函数头做限制,可以是任意数量的任意类型参数。
run的详细帮助:http://doc.qt.io/qt-5/qtconcurrentrun.html,也可以看看本机的qtconcurrentrun.h文件,可以看到里面有很多的run的重载函数
下面给出最基本的使用
- #include <QCoreApplication>
- #include <QtConcurrent>
- #include <QList>
- #include <QDebug>
- #include <QThread>
- void function(const QList<int>& param1, const int& param2, Qt::HANDLE main_id) {
- qDebug()<<"function param:"<<param1<<param2<<main_id;
- qDebug()<<"function thread id:" <<QThread::currentThreadId();
- }
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QList<int> testVactor;
- for(int i = 1; i <= 3; i++) {
- testVactor.push_back(i);
- }
- qDebug() << "main thread id:" << QThread::currentThreadId();
- QFuture<void> f = QtConcurrent::run(function,testVactor,666,QThread::currentThreadId());
- f.waitForFinished();//要等待,否则线程没运行完程序结束会出错
- return 0;
- }
结果
- main thread id: 0x2a10
- function param: (1, 2, 3) 666 0x2a10
- function thread id: 0x2344
4.1. 其他使用方式-指定线程池
有时候希望运行的函数在全局线程池或者局部线程池运行,而不是有qt托管处理,可以进行如下方式调用:
- extern void aFunction();
- QThreadPool pool;
- QFuture<void> future = QtConcurrent::run(&pool, aFunction);
5. 阻塞QtConcurrent
上述所有函数都是非阻塞的,所以在return 0前都有waitForFinished,qt同样提供了阻塞函数
见最开始API帮助介绍连接,可以看到相关接口
- void blockingFilter(Sequence &sequence, FilterFunction filterFunction)
- Sequence blockingFiltered(const Sequence &sequence, FilterFunction filterFunction)
- Sequence blockingFiltered(ConstIterator begin, ConstIterator end, FilterFunction filterFunction)
- T blockingFilteredReduced(const Sequence &sequence, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- T blockingFilteredReduced(ConstIterator begin, ConstIterator end, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- void blockingMap(Sequence &sequence, MapFunction function)
- void blockingMap(Iterator begin, Iterator end, MapFunction function)
- T blockingMapped(const Sequence &sequence, MapFunction function)
- T blockingMapped(ConstIterator begin, ConstIterator end, MapFunction function)
- T blockingMappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
- T blockingMappedReduced(ConstIterator begin, ConstIterator end, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
可以看到对应函数的介绍都有:
Note: This function will block until all items in the sequence have been processed.
使用方式近似,不提供示例了。
Qt多线程-QtConcurrent并行运算高级API的更多相关文章
- Qt多线程-总结QThread-QThreadPool-QtConcurrent
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent 本文 ...
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- 1.QT多线程使用小结
开头 一个进程可以有一个或更多线程同时运行.线程可以看做是"轻量级进程",进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理. Qt 使用QThread来管理线 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- SeetaFaceQt:Qt多线程
为什么要做多线程,说个最简单的道理就是我们不希望在软件处理数据的时候界面处于无法响应的假死状态.有些处理是灰常花时间的,如果把这样的处理放到主线程中执行,就会导致软件一条路走到底,要等到处理完才能接收 ...
- 【QT】 Qt多线程的“那些事”
目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...
- UNET学习笔记2 - 高级API(HLAPI)
高级API是在实时传输低级API基础上建立起来的,为多人游戏提供大量通用的组件.通过HLAPI开发者仅需少量的工作就可以搭建多人联网游戏. HLAPI 使用命名空间 UnityEngine.Netwo ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
随机推荐
- Windows系统Python 虚拟环境virtualenv安装
1.我们用pip安装virtualenv >pip3 install virtualenv 2.创建工程目录 >mkdir myproject 3.进入工程目录 >cd myproj ...
- 《你不知道的JavaScript》系列分享专栏
<你不知道的JavaScript>系列分享专栏 你不知道的JavaScript”系列就是要让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部 ...
- C语言之数组和函数
数组 一维数组 定义:类型符 数组名 [常量表达式] int a[]={1,2,3,4,5,}; #include<stdio.h> #define NUM 6 void main() ...
- 将python自动转换为.exe文件
使用py2exe包进行转换.py2exe怎么装的可以网上另查.时间久了,记不太清了...... 这个程序可以把自己进行转换.但是没法运行....其实只要是需要修改自身的程序打包后都没法运行. # -* ...
- PAT甲级 1004.Counting Leaves
参考:https://blog.csdn.net/qq278672818/article/details/54915636 首先贴上我一开始的部分正确代码: #include<bits/stdc ...
- 20155224聂小益 2016-2017-2 《Java程序设计》第1周学习总结
20155224聂小益 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 第一章内容不是很多,主要介绍了Java发展历程与Java的使用平台. JVM: ...
- 资源很多,你却不会使用——以不变应万变才是自学Java的正确方法
鄙人乐于寻找学习方法,在这里提出自己的见解,希望可以帮助想玩好Java而又感觉很难上手的同学对Java不再恐惧 现状 我们的同学们除了某月,某婷等等大神以外,想必仍然存在着一大批同学根本没有摸索到学习 ...
- 20145226夏艺华 网络对抗技术EXP4 恶意代码分析
20145226夏艺华 网络对抗技术EXP4 恶意代码分析(未完成版) 回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作 ...
- python 多线程笔记(6)-- 闭包
在类里弄一个闭包出来 很多资料上说,类内部的变量有两种. 按定义所在的位置,分__init__上方的和__init__下方的 按内存所在的位置,分类的和实例的,或者说公共的和私有的 现在,我想在类里定 ...
- 转:后台管理UI的选择
注:文中缺少了ZUI和LAYUI两个. 目录 一.EasyUI 二.DWZ JUI 三.HUI 四.BUI 五.Ace Admin 六.Metronic 七.H+ UI 八.Admin LTE 九.I ...