如何创建具有立即可用价值的 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 和其他类似服务如何立即创建子域,即立即可用?