У меня есть программа с QThread
, который содержит сетевой клиент. Предполагается, что клиент должен взять объект, обработать его, загрузить его на сервер, получить ответ и отправить отчет в основной поток. Я сделал это с std::promise
и использовал его future
, я сделал std::promise
член объекта выбрасывается после взятия его будущего.
Минимальный пример кода следующий:
Объект, который я излучаю:
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 сделать то же самое?
Я только нашел QFuture
класс, который можно использовать с QtConcurrent. Я не смог найти ни одного примера, который объясняет, как использовать это с QThread
, Какие у меня есть варианты сделать это с Qt правильно?
да, вы можете использовать QFuture без QConcurrent. Но API не документирован. Вы можете взглянуть на мою библиотеку-оболочку AsyncFuture по адресу:
https://github.com/benlau/asyncfuture
У него есть яркий пример использования QFuture как объекта обещания.
Других решений пока нет …