Russian Qt Forum

Qt => Работа с сетью => Тема начата: crashtua от Август 22, 2012, 11:47



Название: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: crashtua от Август 22, 2012, 11:47
Как при работе с QNetworkAccessManager заблокировать поток при запросе? Что бы при вызове
Код
C++ (Qt)
QNetworkReply* reply = nam->post(QNetworkRequest(url),data);
поток, в котором мы его вызвали, заблокировался...


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: crashtua от Август 22, 2012, 11:51
А то вызывать в цикле
Код
C++ (Qt)
QNetworkReply::isFinished()
как то не кошерно...


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: Bepec от Август 22, 2012, 12:01
Сам недавно попал в ловушку желания сделать его вызов синхронным. Но через некое время глаза открылись и понял, что тут мешала не асинхронность, а плохое проектирование :D

PS по идее да - только выявляя финишед.


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: QtCoder от Август 22, 2012, 12:35
Код
C++ (Qt)
  QEventLoop * loop = new  QEventLoop(this);
  connect( manager, SIGNAL(finished(QNetworkReply*)), loop, SLOT(quit()) );
 
   QNetworkReply *reply;
   if ( httpMethod == GET ) {
       reply = manager->get( request );
   } else if ( httpMethod == POST ) {
       reply = manager->post( request, authorizationHeader );
   }
 
   // start the event loop and wait for the response
   loop->exec();
 
 


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: crashtua от Август 22, 2012, 12:41
Bepec, плохое проектирование мне не страшно, так как пишу костыль, который связывает Qt с уже готовым приложением, и синхронным надо сделать потому, что так требует приложение, а переделывать полностью на сигналы\слоты уйдет не один день...
QtCoder, а при таком решении остальные сигналы, и там всякие вкусности Qt не умрут до завершения запроса?


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: crashtua от Август 22, 2012, 12:44
И еще, немного не в тему, надо ли после вызова readAll() удалить
Код
C++ (Qt)
QNetworkReply *reply
? Или где то в дебрях Qt оно удалится само?


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: QtCoder от Август 22, 2012, 12:48
Bepec, плохое проектирование мне не страшно, так как пишу костыль, который связывает Qt с уже готовым приложением, и синхронным надо сделать потому, что так требует приложение, а переделывать полностью на сигналы\слоты уйдет не один день...
QtCoder, а при таком решении остальные сигналы, и там всякие вкусности Qt не умрут до завершения запроса?

loop.exec() создает локальный цикл обработки сообщений, который прерывается по сигналу finished Ничего не умрет.


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: QtCoder от Август 22, 2012, 12:49
И еще, немного не в тему, надо ли после вызова readAll() удалить
Код
C++ (Qt)
QNetworkReply *reply
? Или где то в дебрях Qt оно удалится само?
А разве ты его создал чтобы удалять?


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: kambala от Август 22, 2012, 13:03
Цитировать
void QNetworkAccessManager::finished ( QNetworkReply * reply ) [signal]
...
Note: Do not delete the reply object in the slot connected to this signal. Use deleteLater().
так что удалять надо


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: Patrin Andrey от Август 22, 2012, 13:07
http://qt-project.org/doc/qt-4.8/qnetworkaccessmanager.html

Note: After the request has finished, it is the responsibility of the user to delete the QNetworkReply object at an appropriate time. Do not directly delete it inside the slot connected to finished(). You can use the deleteLater() function.


Название: Re: QNetworkAccessManager заблокировать поток до получения ответа
Отправлено: crashtua от Август 22, 2012, 13:22
Спасибо всем, работает на ура!