Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QHttp, как сделать его синхронным? блокирующий вызов методов 
:(
    Опции темы
sergey_85
Дата 15.10.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

В Qt (4.4.3) есть много классов, которые используют сигналы и слоты, к примеру QHttp, QFtp т.е. при вызове ф-ции не происходит блокирование, а результат выполнения принимается через сигнал-слот.

Можно ли как-то изменить эти объекты, чтобы была возможность вызывать ф-ции в блокирующем режиме?

например
Код

QFtp::connectToHost(...)

QNetworkReply * QNetworkAccessManager::post ( const QNetworkRequest & request, const QByteArray & data )


спасибо!


--------------------
A good design always pays off.
PM MAIL   Вверх
null56
Дата 18.10.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(sergey_85 @  15.10.2010,  19:52 Найти цитируемый пост)
Можно ли как-то изменить эти объекты, чтобы была возможность вызывать ф-ции в блокирующем режиме?

судя по описалову, нет
Цитата

The class works asynchronously, so there are no blocking functions. If an operation cannot be executed immediately, the function will still return straight away and the operation will be scheduled for later execution. The results of scheduled operations are reported via signals. This approach depends on the event loop being in operation.

PM MAIL   Вверх
boostcoder
Дата 18.10.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 4
Всего: 110



 smile 
всегда все ищут способ добиться асинхронности.. а тут на оборот? smile 
PM WWW   Вверх
Alca
Дата 18.10.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



А что ты хочешь этим добиться?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Любитель
Дата 19.10.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



При необходимости решается локальным QEventLoop, но.. вы уверены, что синхронная работа будет лучше в вашем случае?


--------------------
PM MAIL ICQ Skype   Вверх
kefir01
Дата 19.10.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Кстати вопрос вдогонку - необходимо проверить соединение с сервером - как задержать выполнение программы до получения сигнала от QNetworkReply и определения ошибки?
PM MAIL   Вверх
null56
Дата 19.10.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(kefir01 @  19.10.2010,  17:25 Найти цитируемый пост)
как задержать выполнение программы до получения сигнала от QNetworkReply

"задержит" как раз exec от eventloop....
чем такая схема не устраивает?
1) коннект
2) exec
3) в слотах остальные операции, придет ошибка, значит завершайся, если придет подтверждение, то прямо из слота отправляй что тебе нужно
зачем что - то задерживать с помощью блокировок, если можно обрабатывать события в асинхронном режиме без дополнительных расходов?
PM MAIL   Вверх
kefir01
Дата 19.10.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Да почему - устраивает. От QEventLoop надо наследоваться или тупо создание объекта в коде сгодится?
PM MAIL   Вверх
null56
Дата 20.10.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(kefir01 @  19.10.2010,  18:44 Найти цитируемый пост)
От QEventLoop надо наследоваться или тупо создание объекта в коде сгодится? 

Я бы добавил создание и вызов метода int exec() и в отсутствии в данном потоке других запущенных обработчиков событий.
Зависит от задачи и чего ты хочешь от  от локального обработчика событий (QEventLoop). если все события реализованы в объекте, который создается в рамках потока обработчика, то достаточно вызвать метод int exec (); не создаваля локальный QEventLoop...
обрати внимание, что метод exec() есть в классах QThread и QCoreApplication/QApplication, возможно твою задачу можно решить и без создания объекта QEventLoop

Это сообщение отредактировал(а) null56 - 20.10.2010, 00:17
PM MAIL   Вверх
kefir01
Дата 21.10.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Спасибо, я разобрался.

Сделал так:

myclass.h
Код

private:
        QEventLoop eventLoop;


Дальше ловлю "тестовый" запрос по url и в случае наличия/отсутствия ошибки "Connection refused" торможу eventLoop c соответствующими параметрами.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.