2017-03-29 183 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像一个承诺对象。

相关问题