QFuture 类 Qt 控制线程

本文介绍了 QtConcurrent 框架中的 QFuture 类,探讨了如何使用该类进行多线程同步计算并获取结果。文中详细解释了 QFuture 的主要功能,如取消、暂停计算等,并给出一个简单的 C++ 示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:

一个简单的demo:

[cpp]  view plain  copy
  1. #include <QDebug>  
  2. #include <QThread>  
  3. #include <QString>  
  4. #include <qtconcurrentrun.h>  
  5. #include <QApplication>  
  6.   
  7. using namespace QtConcurrent;  
  8.   
  9. void hello(QString name)  
  10. {  
  11.     qDebug() << "Hello" << name << "from" << QThread::currentThread();  
  12. }  
  13.   
  14. int main(int argc, char **argv)  
  15. {  
  16.     QApplication app(argc, argv);  
  17.     QFuture<void> f1 = run(hello, QString("Alice"));  
  18.     QFuture<void> f2 = run(hello, QString("Bob"));  
  19.     f1.waitForFinished();  
  20.     f2.waitForFinished();  
  21. }  

可以看下终端的输出结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值