Qt之Concurrent框架

简述

QtConcurrent命名空间提供了一个高级API来编写多线程程序,而无需使用低级线程原语,例如:互斥、读写锁、等待条件或信号量。使用QtConcurrent编写的程序使用的线程数量会自动根据可用的处理器数量进行调整,这意味着,当在未来部署多核系统时,今天编写的应用程序将继续适应。

Qt Concurrent

QtConcurrent为并行列表处理包含了函数式编程风格APIs,包括用于共享内存(非分布式)系统的一个MapReduce和FilterReduce实现,以及用于管理GUI应用程序异步计算的类:

  • Concurrent Map and Map-Reduce

    • QtConcurrent::map():适用于一个容器中的所有item元素,直接修改items。
    • QtConcurrent::mapped():就像map(),只是它返回一个修改后的新容器。
    • QtConcurrent::mappedReduced():就像mapped(),只是修改后的结果减少或折叠成一个单一的结果。
  • Concurrent Filter and Filter-Reduce

    • QtConcurrent::filter():从一个容器中删除所有items基于过滤器函数的结果。
    • QtConcurrent::filtered():就像filter(),只是它以过滤后的结果返回一个新容器。
    • QtConcurrent::filteredReduced():就像filtered(),只是过滤后的结果减少或折叠成一个单一的结果。
  • Concurrent Run

    • QtConcurrent::run():在另一个线程中运行一个函数。
  • QFuture:表示异步计算的结果。

  • QFutureIterator:允许通过QFuture遍历可用的结果。
  • QFutureWatcher:允许使用信号槽来监控一个QFuture。
  • QFutureSynchronizer:是一个方便的类,用于一些QFutures自动同步。

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

STL迭代器支持概述:

迭代器类型 示例类 支持状态
Input Iterator 不支持
Output Iterator 不支持
Forward Iterator std::slist 支持
Bidirectional Iterator QLinkedList, std::list 支持
Random Access Iterator QList, QVector, std::vector 支持和推荐


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

非直接修改的函数,例如:mapped()和filtered()当调用时,复制一个容器。如果你正在使用的STL容器,这个副本操作可能需要一段时间,在这种情况下,建议指定开始和结束容器的迭代器。

posted @ 2016-07-29 16:32  挨踢人啊  阅读(812)  评论(0编辑  收藏  举报