版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:Qt多线程-QtConcurrent并行运算高级API     本文地址:http://techieliang.com/2017/12/608/

1. 介绍

Qt除了提供基本的QThread实现多线程,并提供QThreadPool实现线程池以外,还提供了QtConcurrent模块用于并行计算。

使用此类需要在pro文件增加QT += concurrent

QtConcurrent命名空间帮助文档API介绍帮助

1.1. API

  1. void blockingFilter(Sequence &sequence, FilterFunction filterFunction)
  2. Sequence blockingFiltered(const Sequence &sequence, FilterFunction filterFunction)
  3. Sequence blockingFiltered(ConstIterator begin, ConstIterator end, FilterFunction filterFunction)
  4. T blockingFilteredReduced(const Sequence &sequence, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  5. T blockingFilteredReduced(ConstIterator begin, ConstIterator end, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  6. void blockingMap(Sequence &sequence, MapFunction function)
  7. void blockingMap(Iterator begin, Iterator end, MapFunction function)
  8. T blockingMapped(const Sequence &sequence, MapFunction function)
  9. T blockingMapped(ConstIterator begin, ConstIterator end, MapFunction function)
  10. T blockingMappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  11. T blockingMappedReduced(ConstIterator begin, ConstIterator end, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  12. QFuture<void> filter(Sequence &sequence, FilterFunction filterFunction)
  13. QFuture<T> filtered(const Sequence &sequence, FilterFunction filterFunction)
  14. QFuture<T> filtered(ConstIterator begin, ConstIterator end, FilterFunction filterFunction)
  15. QFuture<T> filteredReduced(const Sequence &sequence, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  16. QFuture<T> filteredReduced(ConstIterator begin, ConstIterator end, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  17. QFuture<void> map(Sequence &sequence, MapFunction function)
  18. QFuture<void> map(Iterator begin, Iterator end, MapFunction function)
  19. QFuture<T> mapped(const Sequence &sequence, MapFunction function)
  20. QFuture<T> mapped(ConstIterator begin, ConstIterator end, MapFunction function)
  21. QFuture<T> mappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  22. QFuture<T> mappedReduced(ConstIterator begin, ConstIterator end, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  23. QFuture<T> run(Function function, ...)
  24. 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
  • 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

  1. #include <QCoreApplication>
  2. #include <QtConcurrent>
  3. #include <QVector>
  4. #include <QDebug>
  5. #include <QFuture>
  6. void MapFunction(int& num) {
  7. num += 1;
  8. }
  9. int mappedReducedFunction(const int& num) {
  10. return num + 1;
  11. }
  12. void ReduceFunction(int& result, const int& item) {
  13. int t_r = result;
  14. result = item > result ? item : result;
  15. qDebug()<<t_r<<result<<item;
  16. }
  17. int main(int argc, char *argv[]) {
  18. QCoreApplication a(argc, argv);
  19. QVector<int> testVactor;
  20. for(int i = 1; i <= 3; i++) {
  21. testVactor.push_back(i);
  22. }
  23. for(int i = 1; i <= 3; i++) {
  24. testVactor.push_back(10-i);
  25. }
  26. qDebug() << "start m:" << testVactor;
  27. QFuture<void> f = QtConcurrent::map(testVactor, MapFunction);
  28. f.waitForFinished();
  29. qDebug() << "map result:" << testVactor;//map直接修改源数据
  30. QFuture<int> r = QtConcurrent::mappedReduced(testVactor, mappedReducedFunction, ReduceFunction);
  31. qDebug() << "mappedReduced result:" << r.result();
  32. return 0;
  33. }

注意几个函数的声明形式,不可有差距。结果

  1. start m: QVector(1, 2, 3, 9, 8, 7)
  2. map result: QVector(2, 3, 4, 10, 9, 8)
  3. 0 3 3
  4. 3 4 4
  5. 4 5 5
  6. 5 11 11
  7. 11 11 10
  8. 11 11 9
  9. mappedReduced result: 11

结果示意很明显,reduced最终表留的是等于函数result参数值的项

3. QtConcurrent::filter

filter详细介绍:http://doc.qt.io/qt-5/qtconcurrentfilter.html

  1. #include <QCoreApplication>
  2. #include <QtConcurrent>
  3. #include <QList>
  4. #include <QDebug>
  5. #include <QFuture>
  6. bool filterFunction(const int& num) {
  7. return (num > 5);
  8. }
  9. void ReduceFunction(int& result, const int& item) {
  10. int t_r = result;
  11. result = item > result ? item : result;
  12. qDebug()<<t_r<<result<<item;
  13. }
  14. int main(int argc, char *argv[]) {
  15. QCoreApplication a(argc, argv);
  16. QList<int> testVactor;
  17. for(int i = 1; i <= 3; i++) {
  18. testVactor.push_back(i);
  19. }
  20. for(int i = 1; i <= 3; i++) {
  21. testVactor.push_back(10-i);
  22. }
  23. qDebug() << "start m:" << testVactor;
  24. QFuture<void> f = QtConcurrent::filter(testVactor, filterFunction);
  25. f.waitForFinished();
  26. qDebug() << "map result:" << testVactor;//map直接修改源数据
  27. QFuture<int> r = QtConcurrent::filteredReduced(testVactor, filterFunction, ReduceFunction);
  28. qDebug() << "mappedReduced result:" << r.result();
  29. return 0;
  30. }

注意几个函数的声明形式,不可有差距。filter函数要返回bool类型,用于判断是否过滤此元素

结果:

  1. start m: (1, 2, 3, 9, 8, 7)
  2. map result: (9, 8, 7)
  3. 0 9 9
  4. 9 9 8
  5. 9 9 7
  6. mappedReduced result: 9

4. QtConcurrent::run

感觉run用起来很舒服,因为他没有对运行函数头做限制,可以是任意数量的任意类型参数。

run的详细帮助:http://doc.qt.io/qt-5/qtconcurrentrun.html,也可以看看本机的qtconcurrentrun.h文件,可以看到里面有很多的run的重载函数

下面给出最基本的使用

  1. #include <QCoreApplication>
  2. #include <QtConcurrent>
  3. #include <QList>
  4. #include <QDebug>
  5. #include <QThread>
  6. void function(const QList<int>& param1, const int& param2, Qt::HANDLE main_id) {
  7. qDebug()<<"function param:"<<param1<<param2<<main_id;
  8. qDebug()<<"function thread id:" <<QThread::currentThreadId();
  9. }
  10. int main(int argc, char *argv[]) {
  11. QCoreApplication a(argc, argv);
  12. QList<int> testVactor;
  13. for(int i = 1; i <= 3; i++) {
  14. testVactor.push_back(i);
  15. }
  16. qDebug() << "main thread id:" << QThread::currentThreadId();
  17. QFuture<void> f = QtConcurrent::run(function,testVactor,666,QThread::currentThreadId());
  18. f.waitForFinished();//要等待,否则线程没运行完程序结束会出错
  19. return 0;
  20. }

结果

  1. main thread id: 0x2a10
  2. function param: (1, 2, 3) 666 0x2a10
  3. function thread id: 0x2344

4.1. 其他使用方式-指定线程池

有时候希望运行的函数在全局线程池或者局部线程池运行,而不是有qt托管处理,可以进行如下方式调用:

  1. extern void aFunction();
  2. QThreadPool pool;
  3. QFuture<void> future = QtConcurrent::run(&pool, aFunction);

5. 阻塞QtConcurrent

上述所有函数都是非阻塞的,所以在return 0前都有waitForFinished,qt同样提供了阻塞函数

见最开始API帮助介绍连接,可以看到相关接口

  1. void blockingFilter(Sequence &sequence, FilterFunction filterFunction)
  2. Sequence blockingFiltered(const Sequence &sequence, FilterFunction filterFunction)
  3. Sequence blockingFiltered(ConstIterator begin, ConstIterator end, FilterFunction filterFunction)
  4. T blockingFilteredReduced(const Sequence &sequence, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  5. T blockingFilteredReduced(ConstIterator begin, ConstIterator end, FilterFunction filterFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  6. void blockingMap(Sequence &sequence, MapFunction function)
  7. void blockingMap(Iterator begin, Iterator end, MapFunction function)
  8. T blockingMapped(const Sequence &sequence, MapFunction function)
  9. T blockingMapped(ConstIterator begin, ConstIterator end, MapFunction function)
  10. T blockingMappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions reduceOptions = UnorderedReduce | SequentialReduce)
  11. 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.

使用方式近似,不提供示例了。

转载请以链接形式标明本文标题和地址:Techie亮博客 » Qt多线程-QtConcurrent并行运算高级API

Qt多线程-QtConcurrent并行运算高级API的更多相关文章

  1. Qt多线程-总结QThread-QThreadPool-QtConcurrent

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent     本文 ...

  2. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  3. QT从入门到入土(四)——多线程(QtConcurrent::run())

    引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...

  4. 1.QT多线程使用小结

    开头 一个进程可以有一个或更多线程同时运行.线程可以看做是"轻量级进程",进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理. Qt 使用QThread来管理线 ...

  5. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  6. SeetaFaceQt:Qt多线程

    为什么要做多线程,说个最简单的道理就是我们不希望在软件处理数据的时候界面处于无法响应的假死状态.有些处理是灰常花时间的,如果把这样的处理放到主线程中执行,就会导致软件一条路走到底,要等到处理完才能接收 ...

  7. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

  8. UNET学习笔记2 - 高级API(HLAPI)

    高级API是在实时传输低级API基础上建立起来的,为多人游戏提供大量通用的组件.通过HLAPI开发者仅需少量的工作就可以搭建多人联网游戏. HLAPI 使用命名空间 UnityEngine.Netwo ...

  9. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

随机推荐

  1. Python学习笔记九:装饰器,生成器,迭代器

    装饰器 本质是函数,装饰其他函数,为其他函数添加附加功能 原则: 1不修改原函数的源代码 2不修改原函数的调用方式 知识储备: 1函数即变量 使用门牌号的例子说明函数,调用方式与变量一致 2高阶函数 ...

  2. 第一节 如何用Go实现单链表

    一.概念介绍 下面这副图是我们单链表运煤车队. 每节运煤车就是单链表里的元素,每节车厢里的煤炭就是元素中保存的数据.前后车通过锁链相连,作为单链表运煤车,从1号车厢开始,每节车厢都知道后面拉着哪一节车 ...

  3. VC6无法生成Release版本程序

    在工程设置,将Setting for后面的选项改为Win32 Release.然后重新编译.结果仍然没有生成release,而且打开设置时,依然是Win32 Debug. 解决办法,在VC6.0的工具 ...

  4. electron安装与使用

    系统 WIN10 X64 1. python-2.7.15.amd64.msi 2. node-v10.4.1-x64.msi 3. VS2015 community(社区版) 4. npm conf ...

  5. 20155315 2017-05-10 《Java程序设计》课堂代码检查

    一.教材代码检查-p98 代码要求 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号 代码链接 运行结果截图 二.在IDEA中以TDD的方式对String类和Arrays类进行 ...

  6. 实验一:实现求正整数1-N之间所有质数的功能,并进行测试。

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 命令行下的程序开 ...

  7. WPF MVVM从入门到精通4:命令和事件

    原文:WPF MVVM从入门到精通4:命令和事件   WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WP ...

  8. Linux环境配置备忘

    1.Ubuntu服务器版本装scipy 预装版本可能fortran包版本过旧或者不全,安装scipy之前需要更新环境. sudo apt-get install gfortran libopenbla ...

  9. android 图片二维码识别和保存(一)

    最新业务开发二维码识别的功能,这个功能,在很多应用上都有,比如微信长按图片识别二维码,如果图片中存在可以识别的二维码时,可以增加一个选项 识别二维码.那么如何去实现这个功能呢.这里其实也非常简单,首先 ...

  10. mybatis拦截器使用

    目录 mybatis 拦截器接口Interceptor spring boot + mybatis整合 创建自己的拦截器MyInterceptor @Intercepts注解 mybatis拦截器入门 ...