crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в использование QNetworkAccessManager
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
eldar85 Дата 11.8.2010, 17:28
  да я подкоректировал немного с таймаутом...
Алексей1153 Дата 11.8.2010, 16:46
  eldar85, не во всякой задаче удасться так сделать :)

Ну а в твоём решении ещё не помешало бы таймаутом задаться, а то навсегда может зависнуть
eldar85 Дата 11.8.2010, 15:48
  решил задачу с помощью простого цикла))))
QString network::exec()
{
    
    
    manager = new QNetworkAccessManager;
    QNetworkRequest request;
    request.setUrl(QUrl(Url));
    reply = manager->post(request, postdata);
    
    
    
    connect(reply, SIGNAL(finished()), this, SLOT(getReplyFinished()));
    connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadReply()));
    
    while(buffer == "")
    {
        qApp->processEvents();
    }
    
    
    return buffer;
    
}
BRE Дата 11.8.2010, 14:27
  Ты про синхронную загрузка?
На форуме были темы в которых этот способ обсуждался. Поищи.
Посмотри на класс QEventLoop.
eldar85 Дата 11.8.2010, 14:18
  как все неудобно(( я думал перейтис cUrl на Qt шные методы работы с сетью будет удобнее, но оказалось все вообще стремно в библиотеке QNetwork либо просто по другому как то делать нужно...
по идее я хотел чтобы я мог в главном методе start() вызвать к примеру загрузку одной страницы, затем в этом же старте получив ответ от сервера в строку получить нужные данные тут же start() отправить пост запрос с полученными данными от первой загрузки и так далее... но получается одна ерунда, единственное что получилось вызвать в главном методе загрузку страницы с сервера и слотом поместить ее в переменную но только после того как произведен выход из start() и exec(). а мне нужно чтобы в start() вызвалось exec() затем дождалось окончания загрузки, получило ответ от exec() и только потом тут же в start() начало действие дальше как в обычном с++ когда вызываешь из одной функции другую функцию то первая не завершает работу пока функция вызванная внутри нее не завершит работу...
Алексей1153 Дата 11.8.2010, 13:33
  когда отправляешь запросы, складываешь их в список. Когда станут приходить ответы - надо будет сопоставить ответ с запросом и обработать

блин, там std, а не atd
eldar85 Дата 11.8.2010, 13:24
  да такое я пробывал
void network::readyReadReply()
{
    buffer = QString::fromUtf8(reply->readAll());
    emit pMainClassObj->slot_GotNewData(buffer);
}

не помогает...

а про atd::map<время,QString> m_RequestList; я не понял, как это?
Алексей1153 Дата 11.8.2010, 13:11
  ну дык... как то так:

void network::readyReadReply()
{
    buffer = QString::fromUtf8(reply->readAll());
    emit pMainClassObj->slot_GotNewData(buffer);
}


А для составления требуемого порядка - завести ассоциативный упорядоченный список по времени посылки сообщения
atd::map<время,QString> m_RequestList;

, а так же список для принимаемых сообщений (если надо)
А дальше - логика
eldar85 Дата 11.8.2010, 12:41
  как же я тогда получу ответ вот сдесь

CMainClass::RequestNewData(......)
{
  net->load("http://www.forismatic.com/api/1.0/");
  net->setPost("method=getQuote&format=xml");
  net->exec();
}


и смогу в этой же функции парсить ответ сервера и делать еще несколько пост запросов с выпарсинными данными из первого запроса?
Алексей1153 Дата 11.8.2010, 12:29
  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)
процедура создания объекта для асинхронной работы (это может быть и в конструкторе главного класса)
CMainClass::CMainClass(...):...
{
    ...
    network *net = new network;
    ...
}


2) процедура запроса данных
CMainClass::RequestNewData(......)
{
  net->load("http://www.forismatic.com/api/1.0/");
  net->setPost("method=getQuote&format=xml");
  net->exec();
}


3) слот приёма данных
CMainClass::slot_GotNewData(const QString& data)
{
   qDebug() << data;
}
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 18.4.2024, 9:38