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()返回的可以。