首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建具有立即可用值的QFuture?

如何创建具有立即可用值的QFuture?
EN

Stack Overflow用户
提问于 2018-06-09 09:50:28
回答 1查看 2.3K关注 0票数 3

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

代码语言:javascript
复制
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 对象?

或者(更全面的)如何正确地从这样的方法返回?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 19:38:05

当没有数据可返回时,一切都很简单--这应该是在现代C++中尝试的第一件事:

代码语言:javascript
复制
return {};

或者,如果您针对的是某个过时的平台(

代码语言:javascript
复制
return QFuture<bool>();

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

代码语言:javascript
复制
// 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());
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50772976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档