分配给运行 QFuture
Posted
技术标签:
【中文标题】分配给运行 QFuture【英文标题】:Assigning to running QFuture 【发布时间】:2015-09-16 18:15:14 【问题描述】:我可以将另一个 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】:来自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);
没有问题;原始线程将过期并退出。然而,这样做的效率值得怀疑。
【讨论】:
waitForFinished()
方法也等待取消(doc.qt.io/qt-4.8/qfuture.html#waitForFinished),这就是我调用此方法的原因。但是,正如您所说,我的QFuture
无论如何都无法取消。以上是关于分配给运行 QFuture的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon EC2 上,是不是可以将密钥对重新分配给已运行的实例?
运行多线程JMeter websocket插件时消息未分配给特定线程
如何通过在 Xcode 中使用 watchkit 将其分配给 Wkinterfaceimage 来直接运行动画 Gif?