【问题标题】:Assigning to running QFuture分配给运行 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);

【问题讨论】:

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


    【解决方案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); 没有问题;原始线程将过期并退出。然而,这样做的效率值得怀疑。

    【讨论】:

    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2019-12-23
    相关资源
    最近更新 更多