我可以为已经运行的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);
答案 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);
没有问题;原始线程将过期,它将退出。然而,这样做的效率值得怀疑。