Qt Concurrent框架

 QFuture

       QFuture类代表一个异步计算结果。

       在QtConcurrent(Qt并发)框架中,使用API进行计算。QFuture允许在某个时间点线程同步对一个或多个结果。结果可以是任何具有默认构造函数和复制构造函数的类型。如果在调用result(),resultat(),或results()函数时,结果是不可用的,QFuture会等到结果变得可用。你可以使用isresultreadyat()函数来确定结果是否准备就绪。QFuture对象报告多个结果,resultcount()函数返回连续数的结果数量。这意味着,它始终是从0到resultcount()安全的遍历结果。

       QFuture提供JAVA式迭代器(QFutureIterator)和stl-style迭代器(QFuture::const_iterator)。使用这些迭代器是另一种访问结果的方式。

       对于运行着的计算QFuture还提供了交互方式。例如,通过cancel()函数可以取消计算。使用setpaused()功能或其中的pause(),resume(),或togglepaused()函数,可以暂停计算。注意,并非所有的异步计算可以取消或暂停。例如,QtConcurrent::run()不能被取消;但通过QtConcurrent::mappedReduced()返回的可以。

       progressvalue(),progressminimum(),progressmaximum(),和progresstext()函数提供了进展信息。waitforfinished()函数使调用线程阻塞等待计算完成,确保所有结果可用。

         计算的状态信息可由QFuture的iscanceled(),isstarted(),isfinished(),isrunning(),或ispaused()函数进行查询。

       QFuture是一个轻量级的引用计数的类,可以按值传递。

       QFuture<void>是专门不包含任何结果读取功能。任何QFuture<void>可以被分配或复制到一个QFuture<void>。这是有用的,如果只有状态或进展的信息需要-而不是实际结果数据。

       使用信号和槽来对运行的任务进行交互,需使用QFutureWatcher。

 

QFutureWatcher

         QFutureWatcher r类使用信号和槽监测QFuture。

       QFutureWatcher提供关于QFuture的信息和通知。使用setFuture ()功能开始监测一个特定的QFuture。future()函数返回setFuture ()设置的future。

       为了使用方便,几个QFuture函数也可在QFutureWatcher中使用:progressValue(), progressMinimum(), progressMaximum(), progressText(), isStarted(), isFinished(), isRunning(), isCanceled(), isPaused(), waitForFinished(), result(),和resultAt ()。cancel(), setPaused(), pause(), resume(),和togglePaused ()函数在QFutureWatcher中作为槽使用。

       状态变化的报告通过started(),finished(),canceled(),paused(),resumed(),resultReadyAt (),和resultsReadyAt ()信号。进度信息由progressRangeChanged (),progressValueChanged ()和progressTextChanged ()信号提供。

         setPendingResultsLimit ()函数提供了节流控制。当的resultReadyAt ()或resultsReadyAt ()信号超过极限,future计算将会自动节流。一旦数量的信号低于极限计算结果将恢复。

示例代码:

// 初始化对象并连接到finished信号

 MyClass myObject;

 QFutureWatcher<int> watcher;

 connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));

 //开始计算

 QFuture<int> future = QtConcurrent::run(...);

 watcher.setFuture(future);

注意,并非所有的异步计算可以取消或暂停。例如,QtConcurrent::run()不能被取消,但通过QtConcurrent::mappedReduced()返回的可以。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值