分配给运行 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?

如何使用 Java 中的参数运行 VBS 函数并将结果分配给变量

将事件分配给在运行时动态创建的 VCL 控件 (2)

返回并将其分配给变量有问题,在Python中多次运行程序