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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Синхронный QNetworkAccessManager  (Прочитано 6215 раз)
phpCoder
Гость
« : Январь 26, 2015, 13:42 »

Добрый день.
Можно ли как-нибудь сделать синхронную работу QNetworkAccessManager для post-запроса? Т.е. не ждать сигнал finished в другой слот и в нем продолжать работать, а ждать выполнение непосредственно в исходном методе? Не хочу дробить метод класса на две части: часть, которая отправляет запрос и часть, которая принимает его.

Не понятно тогда что и зачем возвращает метод post().
Записан
Bepec
Гость
« Ответ #1 : Январь 26, 2015, 13:56 »

Читайте документацию там разжёвано что оно возвращает.
Да, можно как нибудь сделать синхронную работу QNAMa с помощью EventLoop. Десятки таких тем, даже пара прог моих там валяется с примером.

В поиск Улыбающийся
Записан
phpCoder
Гость
« Ответ #2 : Январь 26, 2015, 14:27 »

Если бы понятно, не писал бы тут.

На то и форум! Пример в студию.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Январь 26, 2015, 14:59 »

Пример синхронной работы

Код:
    QUrl url(m_url);

    QNetworkRequest request;
    request.setUrl(url);

    QEventLoop loop;

    QNetworkAccessManager manager;

    connect(&manager,SIGNAL(finished(QNetworkReply*)),&loop,SLOT(quit()));

    QNetworkReply *reply = manager.get(request);
    loop.exec();

    QByteArray data = reply->readAll();

post() ровно как и get() возвращает QNetworkReply, по сути в нем хранится вся информация о ответе сервера, ошибки, заголовки, а так же тело. Если вы обрабатываете сигнал finished, то вы получаете QNetworkReply целиком, со всей информацией которая только может быть. Но иногда возникают ситуации когда ответ слишком большой, например при загрузке файла. Тогда лучше использовать метод readyRead класса QNetworkReply(указатель на экземпляр которого вы уже будете иметь) для того что бы ответ читать по частям, ну не гоже все таки, файл в 1ГБ хранить в оперативной памяти. Это как пример, зачем возвращать указатель на этот объект сразу.
Записан
phpCoder
Гость
« Ответ #4 : Январь 26, 2015, 16:36 »

Гениально!
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Январь 26, 2015, 23:07 »

Стоит еще сразу предупредить, что работа синхронно с QNAM не рекомендуется, т.к. программа может повиснуть.

Код:
QNetworkReply *reply = manager.get(request);
loop.exec();
Зависание может произойти в случае, если сигнал finished() будет выслан до запуска цикла событий (например, когда отсутствует сеть, сигнал будет выслан практически сразу). Такие случаи происходят не часто, но не исключены.
Поэтому, чтобы обезопасить себя, либо делать еще таймер и убивать цикл по таймауту, либо от греха подальше работать асинхронно.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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