использование QNetworkAccessManager |
Здравствуйте, гость ( Вход | Регистрация )
использование QNetworkAccessManager |
eldar85 |
11.8.2010, 10:58
Сообщение
#1
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
пробую сделать класс для работы на QNetworkAccessManager но нифига не пойму одного, вот сделал такой код:
net.h
net.cpp
ну и сам вызов в главном классе
по идее exec() должен вернуть buffer с данными, он он гад ничего не возращает, причем в слоте
загрузка производится, но exec() завершается до того как произойдет вывод reply в buffer. В чем же проблема??? Сообщение отредактировал eldar85 - 11.8.2010, 11:00 |
|
|
Алексей1153 |
11.8.2010, 11:19
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
eldar85 |
11.8.2010, 11:55
Сообщение
#3
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
ну exec() возвращает QString, а buffer это QString, он объявляется в net.h
да все работает, единственное что именно exec() завершается и только потом срабатывает слот
в нем уже есть ответ от сервера, а мне нужно чтобы этот ответ произошел до завершения exec(), чтобы exec() вернул buffer в месте вызова. в слоте
|
|
|
Алексей1153 |
11.8.2010, 11:56
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Насколько я понимаю, когда происходит выход из exec, объект уже завершил работу
А это значит, что тебе в network::readyReadReply() нужно отправить сигнал с буфером в объект основного класса |
|
|
eldar85 |
11.8.2010, 12:04
Сообщение
#5
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
а тут все нормально срабатывает, да проверял, и load() доставляет что нужно и setPost() и exec() принемает все как нужно, единственное он завершается до того как вызовится слот network::readyReadReply() который присвоит QString buffer ответ сервера...из exec() выход происходит до того как был получен ответ от сервера в network::readyReadReply(), получается в функции основного класса
уже заканчивается и только потом происходит ответ от сервера. а мне нужно в start() сделать несколько вызовов и еще парсить и вырезать лишнее в ответе сервера |
|
|
Алексей1153 |
11.8.2010, 12:07
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
так тебе асинхронно надо работать. После запуска нужно дождаться сигнала о приходе данных данных, только потом их считать. В структуре твоего кода не копался, сорри, некогда
Сообщение отредактировал Алексей1153 - 11.8.2010, 12:07 |
|
|
eldar85 |
11.8.2010, 12:13
Сообщение
#7
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
а так получается что в start() был сделан вызов load(), setPost(), exec(), они сработали и завершились, потом завершился старт и только потом вызвался слот network::readyReadReply() который вернул ответ сервера...
да я понимаю что асинхронно нужно но вот никак не пойму как это сделать(( |
|
|
Алексей1153 |
11.8.2010, 12:29
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
eldar85, для асинхронного обмена объект должен жить дольше времени работы с ним. У тебя это выполняется?
Например, объект должен быть членом основного класса Цитата ну и сам вызов в главном классе network *net = new network; QString xStr = net->load("http://www.forismatic.com/api/1.0/")->setPost("method=getQuote&format=xml")->exec(); qDebug() << xStr; здесь код должен быть разделён по меньшей мере на 3 части: 1) процедура создания объекта для асинхронной работы (это может быть и в конструкторе главного класса)
2) процедура запроса данных
3) слот приёма данных
Сообщение отредактировал Алексей1153 - 11.8.2010, 12:31 |
|
|
eldar85 |
11.8.2010, 12:41
Сообщение
#9
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
как же я тогда получу ответ вот сдесь
и смогу в этой же функции парсить ответ сервера и делать еще несколько пост запросов с выпарсинными данными из первого запроса? |
|
|
Алексей1153 |
11.8.2010, 13:11
Сообщение
#10
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
ну дык... как то так:
А для составления требуемого порядка - завести ассоциативный упорядоченный список по времени посылки сообщения atd::map<время,QString> m_RequestList; , а так же список для принимаемых сообщений (если надо) А дальше - логика |
|
|
Текстовая версия | Сейчас: 18.4.2024, 9:53 |