Bra*_*ite 10

如接受的答案所示构建我自己的QFuture对我不起作用.起初它似乎工作正常,但在我的测试中,我意识到它并没有阻止来电者.哎呦!所以我进一步挖掘了代码,发现QFutureInterface是你想要用作"承诺"的东西.像boost :: promise一样,QFutureInterface是你在工作线程中与之交互的东西,它是QFutures的工厂.

所以这就是我在Qt 4.8中所做的事情(不确定这是否适用于更高版本).

QFutureInterface<QVariant> promise;
promise.reportStarted();
...
promise.reportResult(someVariant);
promise.reportFinished();
Run Code Online (Sandbox Code Playgroud)

然后在客户端线程中,假设您可以访问QFutureInterface'promise'

QVariant result = promise.future().result();
Run Code Online (Sandbox Code Playgroud)

future()调用是一种工厂方法,用于创建绑定到QFutureInterface的QFuture.你应该能够获得QFuture,result()如果你愿意,可以稍后再打电话给你.


Rei*_*ica 4

boost::promises 是设定期货价值的手段。在 Qt 中,您无法设置 future,只能返回它们。这是未来“设置”数据的唯一方法。

因此,为了设置未来的数据,您必须从 调用的函数返回它QtConcurrent::run。为此,您可以使用 Qt 的任何机制在线程之间进行通信——事件、互斥保护变量等。您必须告诉运行将返回未来的代码的线程要返回给定的未来。这是实现承诺的唯一方法。

唉,如果您想进入无证领域,那么下面的代码会执行以下操作boost::promise::setValue

QFuture<int> f;
int i = 1;
...
f.d.reportResult(&i);
// or
f.d.reportFinished(&i);
Run Code Online (Sandbox Code Playgroud)

我还没有费心去检查它是否有效。

  • 如果没有一个 QtConcurrent 帮助程序满足您的需求,那么使用“QFutureInterface”(如其他答案中所示)可能是更好的选择。它似乎被视为半公开,最早要到 Qt 6 才会改变:http://lists.qt-project.org/pipermail/development/2015-July/022572.html (2认同)