2012-06-03 45 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模擬但也有實現的承諾(或類似的模式)的幾個社區圖書館:

相關問題