分配给正在运行的QFuture

时间:2015-09-16 18:15:14

标签: c++ qt c++11 concurrency qfuture

我可以为已经运行的QFuture对象分配另一个QFuture对象吗?如下例所示:

 QFuture<int> future = QtConcurrent::run(function);
 future = QtConcurrent::run(anotherFunciton); //assume that future is still running at this point

我意识到这个特殊的例子没有多大意义,只是为了举例。假设第一个函数的结果不再引起我的兴趣,那么做出这样的分配是否安全?或者我必须先取消它吗?如果是这样,我是否必须等待取消才能完成?

 QFuture<int> future = QtConcurrent::run(function);
 future.cancel();
 future.waitForFinished(); //is waiting necessary?
 future = QtConcurrent::run(anotherFunciton);

1 个答案:

答案 0 :(得分:1)

来自http://doc.qt.io/qt-4.8/qtconcurrentrun.html

  

请注意,QtConcurrent :: run()返回的QFuture不支持   取消,暂停或进度报告。 QFuture返回了可以   仅用于查询运行/完成状态和返回   功能的价值。

意思是即使您想要,也无法取消您的QFuture。此外,即使允许取消,为什么要取消它然后等待它完成?

来自http://doc.qt.io/qt-4.8/qthreadpool.html#expiryTimeout-prop

  

在一段时间内未使用的线程将过期。该   默认到期超时为30000毫秒(30秒)。这可以   使用setExpiryTimeout()更改。设置负到期超时   禁用到期机制。

由于QtConcurrent::run()启动的线程由QThreadPool类管理,假设您没有指定否定的到期超时,您应该能够future = QtConcurrent::run(anotherFunciton);没有问题;原始线程将过期,它将退出。然而,这样做的效率值得怀疑。