如何创建具有立即可用值的 QFuture?
How to create a QFuture with an immediately available value?
我有一个函数,returns QFuture
对象作为 QtConcurrent::run
计算的结果。但是,在 运行 并发方法之前可能存在一些条件,我需要从我的函数中手动 return 持有价值的未来。
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
对象?
或者(更全球化)如何从这种方法中正确地return?
当 return 没有数据时,事情就简单了 - 这应该是现代 C++ 中首先要尝试的事情:
return {};
或者,如果您的目标是某些过时的平台 (
return QFuture<bool>();
这样你就得到了一个无效的未来。没有办法直接创建一个携带预设数据的未来,你必须使用 QFutureInterface
为此:
// https://github.com/KubaO/Whosebugn/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());
}
我有一个函数,returns QFuture
对象作为 QtConcurrent::run
计算的结果。但是,在 运行 并发方法之前可能存在一些条件,我需要从我的函数中手动 return 持有价值的未来。
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
对象?
或者(更全球化)如何从这种方法中正确地return?
当 return 没有数据时,事情就简单了 - 这应该是现代 C++ 中首先要尝试的事情:
return {};
或者,如果您的目标是某些过时的平台 ( 这样你就得到了一个无效的未来。没有办法直接创建一个携带预设数据的未来,你必须使用 return QFuture<bool>();
QFutureInterface
为此:// https://github.com/KubaO/Whosebugn/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());
}