Russian Qt Forum

Qt => Работа с сетью => Тема начата: vm-root от Февраль 15, 2009, 17:38



Название: Вопрос про requestFinished
Отправлено: vm-root от Февраль 15, 2009, 17:38
Всем привет!

Помогите разобраться.
Вот сигналы и слоты которые я задействовал.
Код
C++ (Qt)
connect(&http, SIGNAL(done(bool)),
   this, SLOT(httpDone(bool)));
connect(&http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
           this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
connect(&http, SIGNAL(requestFinished(int, bool)),
           this, SLOT(httpRequestFinished(int, bool)));
 
В каждом слоте стоит свое сообщение (cerr <<) чтобы было ясно какой этап в данный момент происходит

В httpRequestFinished прописано cerr << "Http request finished" << endl;

Запрос делается один при нажатии кнопки.
http.setHost(str);
httpGetId = http.get("/", &file);
http.close();

Проблема в том, что на один запрос я получаю несколько вызовов слота httpRequestFinished?
Причем если указывать разные адреса сайтов то количество вызовов httpRequestFinished меняется.
Это ошибка или норма?

В каком слоте тогда нужно обрабатывать окончательно полученные данные.
httpDone? или может еще какой. Если использовать httpDone то в него не передается requestId. Те непонятно, какой запрос завершился.

ps. Задача последовательно скачивать заданные .html
С уважением, Владимир.


Название: Re: Вопрос про requestFinished
Отправлено: ритт от Февраль 15, 2009, 17:49
а параметр int сравнивается с данным httpGetId? код завершения какой?
вроде бы, в примерах всё это неплохо объясняется


Название: Re: Вопрос про requestFinished
Отправлено: vm-root от Февраль 15, 2009, 18:29
Нет не сравнивается.
Вот посмотрел, что выводит.
httpGetId = 2

requestId = 1
requestId = 2
requestId = 3

Как ошибку посмотреть я не знаю.

Код
C++ (Qt)
void FindDialog::httpRequestFinished(int requestId, bool error) //--requestId идентификатор запроса
{
   QString rId;
   rId = rId.setNum(requestId);
   cerr << "Http request finished" << endl;
   qDebug() << rId;
 
 if(error)
 {
     //Тут ошибки обрабатываем ????
 }
 else
 {
 }
}
 


Название: Re: Вопрос про requestFinished
Отправлено: Dendy от Февраль 15, 2009, 19:02
Общение с HTTP сервером строится на диалоге запрос-ответ. Даже если полезный запрос у вас один - всё равно будет несколько вспомогательных, просто игнорируйте их:

Код
C++ (Qt)
void FindDialog::httpRequestFinished(int requestId, bool error)
{
 if ( requestId != httpGetId )
   return;
 ...
}

Если в вашем диалоге с сервером всего один запрос - можете его обработать в httpDone(). И не забывайте смотреть произошла ли ошибка.


Название: Re: Вопрос про requestFinished
Отправлено: FreePascal от Март 30, 2009, 23:04
После запроса моментально вызывается requestFinished(int,bool), второй вызов уже действительно тот что ожидаем.
При создании объекта также вызывается этот сигнал.

Qt 4.5
Может все же баг?