QFuture类能够获取一个一步计算的结果。
通过使用这个 Qt Concurrent 框架内的一个api来开始一次计算。
它可以用允许多个线程同步一个或多个结果在稍后的一段时间内计算完成。这个结果可以是任意一种类型,这个类型有默认的构造函数和拷贝构造函数。如果通过调用:
result(), resultAt(), or results()不能获取当前的执行时间,那QFuture 将会一直等待直到可以获取当前的时间。你可以使用 isResultReadyAt() 来判断这个结果是否已经完成。QFuture 对象会报告不只一个结果, resultCount() 将会返回当前持续结果的数量。这就意味着通过这个结果值 0~resultCount()来进行迭代永远是安全的。
QFuture 提供了一个 Java-style iterator (QFutureIterator) and an STL-style iterator (QFuture::const_iterator). 也可以通过这些迭代器来获取 QFuture 的结果。
-----------------------------
QFuture 也会在运行计算时提供不同的交互方式,例如,这个计算可以被取消通过 cancel() ,被暂停 setPaused() ,或者这些函数 pause(), resume(), or togglePaused() 其中的一个, 要注意不是所有的异步计算都可以被取消或者停止。例如, 这个 future是由 QtConcurrent::run() 返回的那他就不能被取消;但是如果是由 QtConcurrent::mappedReduced() 返回的就是可以的。
由 progressValue(), progressMinimum(), progressMaximum(), and progressText() 可以提供计算的进度信息。这个 waitForFinished() 函数将会使调用的线程锁定等待计算的完成,以此来保证所有的结果是可靠的。
当前的计算状态可以通过 QFuture can be queried using the isCanceled(), isStarted(), isFinished(), isRunning(), or isPaused() 来获得。
QFuture<void> 是被用来执行不包含任何结果的函数的, 而任意的 QFuture<T> 可以被用来复制或者拷贝给 QFuture<void> 函数。这是非常有用的,如果只需要进度或者状态信息,而不需要具体的数据信息。
如果要调用 正在运行的任务在使用的信号和槽, 请使用 QFutureWatcher.
api:
- class const_iterator
- typedef ConstIterator
- QFuture()
- QFuture(const QFuture &)
- ~QFuture()
- begin() const : const_iterator
- cancel()
- constBegin() const : const_iterator
- constEnd() const : const_iterator
- end() const : const_iterator
- isCanceled() const : bool
- isFinished() const : bool
- isPaused() const : bool
- isResultReadyAt(int) const : bool
- isRunning() const : bool
- isStarted() const : bool
- pause()
- progressMaximum() const : int
- progressMinimum() const : int
- progressText() const : QString
- progressValue() const : int
- result() const : T
- resultAt(int) const : T
- resultCount() const : int
- results() const : QList<T>
- resume()
- setPaused(bool)
- togglePaused()
- waitForFinished()
- operator T() const
- operator!=(const QFuture &) const : bool
- operator=(const QFuture &) : QFuture &
- operator==(const QFuture &) const : bool
一个简单的demo:
- #include <QDebug>
- #include <QThread>
- #include <QString>
- #include <qtconcurrentrun.h>
- #include <QApplication>
- using namespace QtConcurrent;
- void hello(QString name)
- {
- qDebug() << "Hello" << name << "from" << QThread::currentThread();
- }
- int main(int argc, char **argv)
- {
- QApplication app(argc, argv);
- QFuture<void> f1 = run(hello, QString("Alice"));
- QFuture<void> f2 = run(hello, QString("Bob"));
- f1.waitForFinished();
- f2.waitForFinished();
- }
可以看下终端的输出结果: