Название: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: Dovgon от Апрель 29, 2016, 08:03 Отправляю в цикле post запросы к серверу. Сигнал finished(), связываю с слотом в котором обрабатываю результат запроса, в конце вызываю reply->deleteLater(). Но при обработки следующего ответа оказывается, что старые данные (QNetworkReply) не удалились. В чем ошибка?
Название: Re: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: arhohryakov от Апрель 29, 2016, 12:06 Хотелось бы увидеть как Вы создаёте запросы и по каким признакам выяснили, что станые данные не удалились.
Название: Re: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: Bepec от Апрель 29, 2016, 12:27 Код.
Название: Re: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: Dovgon от Апрель 29, 2016, 13:20 в коде все просто
... connect(m_net, SIGNAL(finished(QNetworkReply*)), this, SLOT(PostReplyFinisheduser(QNetworkReply*))); ... void MainWindow::PostReplyFinisheduser(QNetworkReply *reply){ int code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if(code==301 || code==302){ QUrl redirectUrl=reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); m_net->get(QNetworkRequest(redirectUrl)); } if(reply->error()==QNetworkReply::NoError){ QByteArray content=reply->readAll(); //content - через несколько итераций приходит старый то есть не сработал reply->deleteLater(); .... } reply->deleteLater(); if(code==200 || code==404){ if(vUser->size()>currentUrl){ QUrl url(vUser->at(currentUrl)->nameurl); QNetworkRequest request(url); ... m_net->post(request, postData); } } } В Векторе все url разные Название: Re: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: Bepec от Апрель 29, 2016, 13:30 Неверно.
Во 1 - у вас Reply каждый раз новый. Т.е. не старый reply с старыми данными, а новый reply с старыми данными. По всей видимости вы запрашиваете одни и те же данные :D во 2 - пользуйтесь тегом [ code ] [ /code]. Вот такой значек на панельке "#". Приводите код, как вы запрашиваете и будем разбираться. Название: Re: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: Dovgon от Апрель 29, 2016, 21:17 сигнал finished вызывается когда загрузка завершена. значит или в самом qt испускается сигнал неправильно, или данные от предыдущего запроса не были удалены reply->deleteLater();. Вопрос в том как от этого эфекта избавится. На зарубежных форумах предлагают перенести работу с запросами в новый поток, может кто покажет пример?
Название: Re: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply Отправлено: Bepec от Апрель 29, 2016, 21:52 Уважаемый Dovgon, давайте я вам скажу 3 простые вещи. Поверьте мне на слово.
1) в Qt ошибок очень мало. 2) в 90% ошибок виноват код программы. 3) в 99% случаев ошибок кода, виноват тот, кто написал этот код. Потому если включить самокритику, вы можете сделать следующие вещи: 1) проверить свой код ещё раз. 2) сделать тестовый проект, воспроизводящий проблему, запаковать его в архив и прикрепить сюда к сообщению. Весь проект, включая pro/cpp/h файлы. Ну или если не включать, то можете посетовать что Qt кривой, люди на форуме злые, а иностранные форумы всё верно говорят. |