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

Posted

技术标签:

【中文标题】如何创建具有立即可用价值的 QFuture?【英文标题】:How to create a QFuture with an immediately available value? 【发布时间】: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,只抛出一个合适的异常会更简单/可以接受吗? 你的例子对我有用 【参考方案1】:

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

return ;

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

return QFuture<bool>();

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

// https://github.com/KubaO/***n/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());

【讨论】:

以上是关于如何创建具有立即可用价值的 QFuture?的主要内容,如果未能解决你的问题,请参考以下文章

wordpress.com 和其他类似服务如何立即创建子域,即立即可用?

Qt多线程:QtConcurrent + QFuture + QFutureWatcher

分配给运行 QFuture

多任务协程怎么写

多任务协程怎么写

使用 QFuture 更新 QProgressDialog