2017-03-29 233 views
0

我有一個程序QThread,它包含一個網絡客戶端。客戶端應該接受一個對象,對其進行處理,將其上傳到服務器,獲取響應並回報主線程。我用std::promise做了這個,並用它的future。我做了std::promise這個物體的一個成員,它已經把它的未來發射出去了。是否可以在沒有QtConcurrent的情況下使用QFuture?

的最小樣本代碼如下:

我發光的對象:

struct FileToUpload 
{ 
    std::string fileData; 
    std::string filename; 
    std::promise<int> promise; 
} 

的部分我使用用於發射:

FileToUpload theFile; 
auto uploadFuture = theFile.promise.get_future(); 
emit uploadFile(&theFile); //passing pointer because promise is non-copyable 
auto uploadSuccess = uploadFuture.get(); 

是否有一個Qt的方式做同樣的事情?

我只發現了一個可用於QtConcurrent的QFuture類。我找不到一個解釋如何在QThread中使用此示例的單個示例。我的選擇是否正確地使用Qt來做到這一點?

+0

您是否需要轉移到QFuture?另外,在你控制下的FileToUpload結構是否可以修改它的定義? –

+0

@ G.M。其實我有充分的自由,無論我是否需要移動未來(儘管我不想複製它......這是一個文件,最終只有幾MB的大小;「Qt元類型」也有一個問題,可複製的東西,所以我通過傳遞指針爲自己節省了麻煩)。我對FileToUpload的外觀也有完全的自由。我需要實現的只是將文件傳遞給線程的模型,並等待客戶端線程在未來完成。我將這一承諾作爲實現它的一種方式,並且可以根據需要進行更改。 –

回答

1

是的,你可以使用沒有QConcurrent的QFuture。但是API沒有記錄。你可以帶着我的包裝庫,AsyncFuture一看,在:

https://github.com/benlau/asyncfuture

它有一個明顯的例子使用QFuture像一個承諾對象。

相關問題