crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QNetworkAccessManager
bo0blik
  опции профиля:
сообщение 13.9.2009, 19:17
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.9.2009
Пользователь №: 1089

Спасибо сказали: 0 раз(а)




Репутация:   0  


void Widget::Login(QByteArray name, QByteArray password)
{

    QNetworkRequest request;

    request.setUrl(QUrl("http://exemple.com/"));

    QByteArray searchString = "act=login&email=" + name + "&pass=" + password;

    ui->plainTextEdit->appendPlainText(name);

    QNetworkReply *reply = login ->post(request, searchString);

}


Данная функция используется в цикле, естественно результат не верный.

Как решить эту проблему?

Желательно пояснять кодом. Возможна ли работа QNetwork в блокирующем режиме?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 13.9.2009, 21:57
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Этот класс не обладает такой возможностью. На крайняк можно создать экземпляр QEventLoop в методе и выходить из цикла событий, когда придет сигнал о завершении запроса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bo0blik
  опции профиля:
сообщение 14.9.2009, 7:13
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.9.2009
Пользователь №: 1089

Спасибо сказали: 0 раз(а)




Репутация:   0  


Можно какой-нибудь банальный пример.

Насколько я понял этот луп просто напросто будет выключатся при помощи сигнала о завершении запроса и слота выхода из лупа.

А как его создать в методе? (просто в документации не одного намека на пример с кодом)

И мне все еще интересны все более-мение правильные решения этой проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.9.2009, 8:18
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(bo0blik @ 14.9.2009, 8:13) *
правильные решения этой проблемы


Правильное решение проблемы - не использовать циклы while/for, а использовать сигналы и слоты.

Цитата(bo0blik @ 14.9.2009, 8:13) *
Насколько я понял этот луп просто напросто будет выключатся при помощи сигнала о завершении запроса и слота выхода из лупа.

Угу exec()/quit()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bo0blik
  опции профиля:
сообщение 14.9.2009, 8:33
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.9.2009
Пользователь №: 1089

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вы не могли бы написать малютку пример использвоания лупа, я бы прям был дико неистово благодарен.

Ибо с простым exec у меня ничего не вышло.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.9.2009, 9:03
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


QEventLoop loop(this);
connect(&request, SIGNAL(finished(QNetworkReply *)), &loop, SLOT(quit()));
post запрос
loop.exec();
проверка reply на error()
если все нормально, то проделываем необходимые операции (те, что мы делали бы по сигналу finished())
reply->deleteLater();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bo0blik
  опции профиля:
сообщение 14.9.2009, 10:23
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.9.2009
Пользователь №: 1089

Спасибо сказали: 0 раз(а)




Репутация:   0  


Оказывается я это уже и делал, но думал это не рабочий вариант ибо возвращался пустой ответ - запрос просто не тот делал.

Но мне все же интересно, что делает функция reply->deleteLater() ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.9.2009, 10:41
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(bo0blik @ 14.9.2009, 11:23) *
Оказывается я это уже и делал, но думал это не рабочий вариант ибо возвращался пустой ответ - запрос просто не тот делал.

Но мне все же интересно, что делает функция reply->deleteLater() ?

Освобождает память выделенную QNAM под QNetworkReply при возвращении в главный цикл событий. Потокобезопасное удаление на тот случай, если указатель может быть тобой использован в другом потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bo0blik
  опции профиля:
сообщение 14.9.2009, 13:03
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 27
Регистрация: 13.9.2009
Пользователь №: 1089

Спасибо сказали: 0 раз(а)




Репутация:   0  


connect(ui->pushButton, SIGNAL( clicked() ), this, SLOT( CheckAcc() ) );
connect(login, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
connect(login, SIGNAL(finished(QNetworkReply*)), this, SLOT(LoginResult(QNetworkReply*)));

void Widget::CheckAcc()
{

     while (!true :)) {
         Login(name, password);
     }

}

void Widget::Login(QByteArray name, QByteArray password)
{
    QNetworkRequest request;
    request.setUrl(QUrl("http://example.com/"));
    QByteArray searchString = "act=login&email=" + name + "&pass=" + password;
    login ->post(request, searchString);
    loop.exec();
}

void Widget::LoginResult(QNetworkReply *reply)
{

    ui->plainTextEdit->appendPlainText(reply->readAll();
    reply->deleteLater();

}


Вот так это выглядит на данный момент, но все же возвращает только последний результат, если по одному запросу делать - то все работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.9.2009, 14:02
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


     while (!true :)) {
         Login(name, password);
     }


Так ведь метод Login ниразу не должен выполнится, у тебя же отрицание true стоит и смайлик :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 21:13