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系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
随机推荐
- Linux命令—tar
day 7:tar压缩.解压缩.打包.解包命令 区分打包和压缩:打包是指将一大堆文件或目录变成一个总的文件:压缩则是将一个大的文件通过一些压缩算法变成一个小文件. 为什么要区分这两个概念呢?这源于Li ...
- Python学习:20.Python网络编程(Socket)
一.Socket介绍 我们知道两个进程如果需要进行通讯,最基本的一个前提是能够唯一标示一个进程.在本地进程通讯中可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很 ...
- Python学习:19.Python设计模式-单例模式
一.单例模式存在的意义 在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式, ...
- 20155307 2016-2017第三次《Java程序设计》课堂实践项目
码云链接 我使用电脑端登录的云班课,截图已经放上去了,却忘了点提交.
- Discover Feature Engineering, How to Engineer Features and How to Get Good at It
Feature engineering is an informal topic, but one that is absolutely known and agreed to be key to s ...
- Yii2 模块module笔记
包含内容: 使用GII新建module 建立子模块 在其他控制器中调用模块的操作(action) 1. 使用Gii工具新建module 注意模块的路径,我们没有写backend\modules\Art ...
- PHP 中的mktime()函数本周时间
上周写一个接口,用到了本周的开始时间和结束时间作为筛选条件去筛选数据,我只记得有mktime()这个函数,具体怎么用的不太清楚,于是百度之,找到了这个: 本周开始时间:date("Y-m-d ...
- python基础——字符串
Python的核心数据类型--字符串 常见字符串常量和表达式 操作 解释 s = '' 空字符串 s = "dodo's" 双引号和单引号 s = 'd\no\p\td\x00o' ...
- js文件上传库
收集了2个与具体UI库和框架无任何耦合的JS文件上传库:支持断点续传.支持npm安装. resumable.js fileapi
- vue 跳转到外部 后回跳
微信 vue 跳转到外部 后回跳 ,比如登陆 授权操作 .需要 路由 先跳转到一个中间页面 后再跳转到授权服务器!而不能跳转前的页面与回跳后的页面相同 不然回跳可能会出现空白 路由不解析.