Russian Qt Forum
Ноябрь 23, 2024, 00:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QNetworkAccessManager finished() не удаляется предыдущей QNetworkReply  (Прочитано 5052 раз)
Dovgon
Гость
« : Апрель 29, 2016, 08:03 »

Отправляю в цикле post запросы к серверу. Сигнал finished(), связываю с слотом в котором обрабатываю результат запроса, в конце вызываю reply->deleteLater(). Но при обработки следующего ответа оказывается, что старые данные (QNetworkReply) не удалились. В чем ошибка?
Записан
arhohryakov
Гость
« Ответ #1 : Апрель 29, 2016, 12:06 »

Хотелось бы увидеть как Вы создаёте запросы и по каким признакам выяснили, что станые данные не удалились.
Записан
Bepec
Гость
« Ответ #2 : Апрель 29, 2016, 12:27 »

Код.
Записан
Dovgon
Гость
« Ответ #3 : Апрель 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 разные
Записан
Bepec
Гость
« Ответ #4 : Апрель 29, 2016, 13:30 »

Неверно.

Во 1 - у вас Reply каждый раз новый. Т.е. не старый reply с старыми данными, а новый reply с старыми данными.
По всей видимости вы запрашиваете одни и те же данные Веселый

во 2 - пользуйтесь тегом [ code ] [ /code]. Вот такой значек на панельке "#".

Приводите код, как вы запрашиваете и будем разбираться.
Записан
Dovgon
Гость
« Ответ #5 : Апрель 29, 2016, 21:17 »

сигнал finished вызывается когда загрузка завершена. значит или в самом qt испускается сигнал неправильно, или данные от предыдущего запроса не были удалены reply->deleteLater();. Вопрос в том как от этого эфекта избавится. На зарубежных форумах предлагают перенести работу с запросами в новый поток, может кто покажет пример?
Записан
Bepec
Гость
« Ответ #6 : Апрель 29, 2016, 21:52 »

Уважаемый Dovgon, давайте я вам скажу 3 простые вещи. Поверьте мне на слово.
1) в Qt ошибок очень мало.
2) в 90% ошибок виноват код программы.
3) в 99% случаев ошибок кода, виноват тот, кто написал этот код.

Потому если включить самокритику, вы можете сделать следующие вещи:
1) проверить свой код ещё раз.
2) сделать тестовый проект, воспроизводящий проблему, запаковать его в архив и прикрепить сюда к сообщению. Весь проект, включая pro/cpp/h файлы.

Ну или если не включать, то можете посетовать что Qt кривой, люди на форуме злые, а иностранные форумы всё верно говорят.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.