【问题标题】:How to create a QFuture with an immediately available value?如何创建具有立即可用价值的 QFuture?
【发布时间】:2018-06-09 09:50:28
【问题描述】:

我有一个函数作为QtConcurrent::run 计算的结果返回QFuture 对象。但是,在运行并发方法之前可能存在一些情况,我需要从我的函数中手动返回一个值持有未来。

QFuture<bool> foo(const QString &bar)
{
    if (bar.isEmpty()) {
        return QFuture<bool>(false); // This does not work.
        // Here I need to return from the function, but I don't know how to do it.
    }
    return QtConcurrent::run([=]() -> bool {
        // Asynchronous computations...
    });
}

如何手动创建QFuture 对象?
或者(更广泛地)如何正确地从这种方法返回?

【问题讨论】:

  • 如果bar 是空的QString,只抛出一个合适的异常会更简单/可以接受吗?
  • 你的例子对我有用

标签: qt qtconcurrent qfuture


【解决方案1】:

当没有要返回的数据时,事情就简单了——这应该是现代 C++ 中首先要尝试的事情:

return {};

或者,如果您的目标是一些过时的平台(

return QFuture<bool>();

这样你得到一个无效的未来。没有办法直接创建带有预设数据的未来,您必须使用QFutureInterface

// https://github.com/KubaO/stackoverflown/tree/master/questions/qfuture-immediate-50772976
#include <QtConcurrent>

template <typename T> QFuture<T> finishedFuture(const T &val) {
   QFutureInterface<T> fi;
   fi.reportFinished(&val);
   return QFuture<T>(&fi);
}

QFuture<bool> foo(bool val, bool valid) {
   if (!valid)
      return {};
   return finishedFuture(val);
}

int main() {
   Q_ASSERT(foo(true, true));
   Q_ASSERT(!foo(false, true));
   Q_ASSERT(foo(false, false).isCanceled());
   Q_ASSERT(foo(true, false).isCanceled());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 2017-12-09
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多