Russian Qt Forum
Ноябрь 23, 2024, 17:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QNetworkAccessManager заблокировать поток до получения ответа  (Прочитано 7169 раз)
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.203 секунд. Запросов: 23.