1

我可以将另一个 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);
4

1 回答 1

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);毫无问题;原始线程将过期并退出。然而,这样做的效率是值得怀疑的。

于 2015-09-16T18:58:26.860 回答