Russian Qt Forum
Июля 06, 2025, 19:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QNetworkAccessManager заблокировать поток до получения ответа  (Прочитано 7440 раз)
crashtua
Гость
« : Августа 22, 2012, 11:47 »

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

А то вызывать в цикле
Код
C++ (Qt)
QNetworkReply::isFinished()
как то не кошерно...
Записан
Bepec
Гость
« Ответ #2 : Августа 22, 2012, 12:01 »

Сам недавно попал в ловушку желания сделать его вызов синхронным. Но через некое время глаза открылись и понял, что тут мешала не асинхронность, а плохое проектирование Веселый

PS по идее да - только выявляя финишед.
Записан
QtCoder
Гость
« Ответ #3 : Августа 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();
 
 
Записан
crashtua
Гость
« Ответ #4 : Августа 22, 2012, 12:41 »

Bepec, плохое проектирование мне не страшно, так как пишу костыль, который связывает Qt с уже готовым приложением, и синхронным надо сделать потому, что так требует приложение, а переделывать полностью на сигналы\слоты уйдет не один день...
QtCoder, а при таком решении остальные сигналы, и там всякие вкусности Qt не умрут до завершения запроса?
Записан
crashtua
Гость
« Ответ #5 : Августа 22, 2012, 12:44 »

И еще, немного не в тему, надо ли после вызова readAll() удалить
Код
C++ (Qt)
QNetworkReply *reply
? Или где то в дебрях Qt оно удалится само?
Записан
QtCoder
Гость
« Ответ #6 : Августа 22, 2012, 12:48 »

Bepec, плохое проектирование мне не страшно, так как пишу костыль, который связывает Qt с уже готовым приложением, и синхронным надо сделать потому, что так требует приложение, а переделывать полностью на сигналы\слоты уйдет не один день...
QtCoder, а при таком решении остальные сигналы, и там всякие вкусности Qt не умрут до завершения запроса?

loop.exec() создает локальный цикл обработки сообщений, который прерывается по сигналу finished Ничего не умрет.
Записан
QtCoder
Гость
« Ответ #7 : Августа 22, 2012, 12:49 »

И еще, немного не в тему, надо ли после вызова readAll() удалить
Код
C++ (Qt)
QNetworkReply *reply
? Или где то в дебрях Qt оно удалится само?
А разве ты его создал чтобы удалять?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Августа 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().
так что удалять надо
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Patrin Andrey
Гость
« Ответ #9 : Августа 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.
Записан
crashtua
Гость
« Ответ #10 : Августа 22, 2012, 13:22 »

Спасибо всем, работает на ура!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 19.