我看到Qt有future類,它是boost::future的直接模擬類,但是什麼是boost::promise的qt?什麼是Qt for boost :: promise <T>?
回答
boost :: promises是設置期貨價值的手段。在Qt中,你不能設置期貨,你可以只有退貨。這是未來「設置」數據的唯一方法。
因此,爲了設置未來的數據,您必須從QtConcurrent::run
調用的函數返回它。要做到這一點,你需要使用任何Qt的線程間通信機制 - 事件,受互斥鎖保護的變量等。你必須告訴運行代碼的線程,該線程將返回未來將返回的未來。這是實現承諾所能做到的唯一方式。
唉,如果你想進入無證領土,然後將下面的代碼做什麼boost::promise::setValue
會:
QFuture<int> f;
int i = 1;
...
f.d.reportResult(&i);
// or
f.d.reportFinished(&i);
我沒有打擾檢查,如果它的工作原理(還)。
'd'成員的文檔說'//警告:d指針沒有記錄並且被認爲是私有的,所以這可能不是要走的路。 –
@JamesHenstridge如果你選擇這樣做,這是一條路,但當然首選解決方案在前面的段落中。 –
如果沒有QtConcurrent助手可以滿足您的需求,那麼使用'QFutureInterface'(就像在其他答案中一樣)可能是更好的選擇。它似乎被視爲是半公開的,並且在最早的Qt 6之前不會改變:http://lists.qt-project.org/pipermail/development/2015-July/022572.html –
構建我自己的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()
。
沒有正式的Qt模擬但也有實現的承諾(或類似的模式)的幾個社區圖書館:
- 本Lau的AsyncFuture(benlau/asyncfuture)
基於無證QFutureInterface
LatencyMachine在his answer已經提到。
它不完全是一種承諾模式,而是一種觀察者模式。 - Benoit Walter的QtPromise(bwalter/qt-promise)
部分基於Ben Lau的AsyncFuture。 - 西蒙·布魯內爾QtPromise(simonbrunel/qtpromise)
- 我QtPromise(julrich/QtPromise)
免責聲明:我是作者。
- 1. 在TypeScript中,定義可返回Promise <T>或Promise <T[]>的函數的最佳方法是什麼?
- 2. 爲什麼boost :: call_traits <double> :: param_type是「const double&」,而不是「double」
- 3. Qt - 什麼是QApplication?
- 4. 什麼是瞬間<2>在boost :: accumulators中的含義
- 5. 「cout <<(_ 1 * 3)」是什麼意思?
- 6. boost :: multi_index_container :: index <Tag> :: type是什麼意思?
- 7. boost :: program_options :: notify()是什麼?
- 8. Boost中的pthread是什麼?
- 9. boost :: heap :: arity,它是什麼?
- 10. C++什麼是std :: shared_future和std :: promise
- 11. 爲什麼不是'Promise Chaining'工作?
- 12. C++:什麼是:: for?
- 13. 什麼是android:includeFontPadding for?
- 14. 什麼是MemoryCache.AddOrGetExisting for?
- 15. 什麼是。$ for CKEditor?
- 16. Java |什麼是/ ** */for?
- 17. 什麼是<NS0:什麼?
- 18. std :: to_string,boost :: to_string和boost :: lexical_cast <std::string>有什麼區別?
- 19. 什麼是boost的shared_ptr(shared_ptr <Y> const&r,T * p)用於?
- 20. 爲什麼在boost :: array <char,8192>中必須是8192?
- 21. 什麼是一個好的返回類型`boost :: shared_ptr <StructA>`?
- 22. Resolving Promise <pending>
- 23. 爲什麼boost :: is_same <int const&,boost :: add_const <int &> :: value等於false?
- 24. 爲什麼我的程序在boost :: enable_shared_from_this <>/boost :: shared_ptr <>中崩潰?
- 25. wcout << L是什麼?
- 26. Promise的TypeScript參數<T>,Why not Promise <T1,T2>?
- 27. 什麼是Qt的配置
- 28. 什麼是Qt端口?
- 29. Qt DropActions:什麼是ActionMask?
- 30. Qt的 - 什麼是代碼
這是一個承諾。 – 2012-06-04 01:26:19