2015-12-16 2 views
1

Когда у меня есть такой код:Как обеспечить QNetworkReply :: закончил действительно поймал

QNetworkReply* reply = netWorkMansger.post(...); 
connect(reply,&QNetworkReply::finished,[=](){//Handler code}); 

Что делать, если между первой и второй линией ответ получает законченную? Чем подключается поздно, не так ли?

ответ

2

Соединиться() было бы слишком поздно, если бы ответ когда-либо выдавал законченный() во время создания, до того, как указатель ответа будет возвращен вызывающему элементу post().

QNetworkReply/QNetworkAccessManager этого не делает, однако начало сетевой операции ответа - queued в цикле событий, то есть операция не начнется до того, как ваш код вернется в цикл событий, иначе события будут обработаны иным образом (в противном случае означает, что один явно вызывает один из нескольких неприятных методов, таких как QDialog :: exec()/QMessageBox :: критический и т. д., QEventLoop :: exec() или processEvents()). Таким образом, ваш код безопасен, если вы сразу подключитесь к ответу.

Неизлучающие сигналы, подобные завершенному() синхронно во время запуска асинхронной операции, на мой взгляд являются одним из самых важных правил при реализации таких операций.