2012-06-03 46 views

回答

3

boost :: promises是设置期货价值的手段。在Qt中,你不能设置期货,你可以只有退货。这是未来“设置”数据的唯一方法。

因此,为了设置未来的数据,您必须从QtConcurrent::run调用的函数返回它。要做到这一点,你需要使用任何Qt的线程间通信机制 - 事件,受互斥锁保护的变量等。你必须告诉运行代码的线程,该线程将返回未来将返回的未来。这是实现承诺所能做到的唯一方式。

唉,如果你想进入无证领土,然后将下面的代码做什么boost::promise::setValue会:

QFuture<int> f; 
int i = 1; 
... 
f.d.reportResult(&i); 
// or 
f.d.reportFinished(&i); 

我没有打扰检查,如果它的工作原理(还)。

+0

'd'成员的文档说'//警告:d指针没有记录并且被认为是私有的,所以这可能不是要走的路。 –

+0

@JamesHenstridge如果你选择这样做,这是一条路,但当然首选解决方案在前面的段落中。 –

+1

如果没有QtConcurrent助手可以满足您的需求,那么使用'QFutureInterface'(就像在其他答案中一样)可能是更好的选择。它似乎被视为是半公开的,并且在最早的Qt 6之前不会改变:http://lists.qt-project.org/pipermail/development/2015-July/022572.html –

9

构建我自己的QFuture,如接受的答案中所示,对我而言并不适用。起初,它似乎在工作,但在我的测试中,我意识到它没有阻止来电者。哎呦!所以我深入研究了一下代码,发现QFutureInterface就是你想用作'承诺'的东西。像boost :: promise一样,QFutureInterface是您在工作线程中与之交互的内容,它是QFutures的工厂。

所以这里是我一直在Qt 4.8中做的(不知道这是否适用于更高版本)。

QFutureInterface<QVariant> promise; 
promise.reportStarted(); 
... 
promise.reportResult(someVariant); 
promise.reportFinished(); 
在客户端线程

然后,假设你有机会获得QFutureInterface“承诺”

QVariant result = promise.future().result(); 

future()调用创建绑定到一个QFutureInterface一个QFuture工厂方法。如果需要,您应该可以获得QFuture并在以后拨打result()

0

没有正式的Qt模拟但也有实现的承诺(或类似的模式)的几个社区图书馆:

相关问题