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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: падает приложение при удалении QNetworkAccessManager  (Прочитано 4096 раз)
majatu
Гость
« : Октябрь 14, 2011, 15:47 »

суть примерно такая: из главного окна GUI запускается класс с запросами

Код:
for(int i=0; i< list.count(); i++)
        {
            ((Class1*)list.at(i))->startProcess();
        }

запускаем запросы

Код:
for (int i=0; i< this->list.count(); i++)
    {
        if(!abort)
        {
            MyNetworkAccessManager *manager = new MyNetworkAccessManager(this);
            manager->i = i;
            manager->moveToThread(this->thread());
            manager->setParent(this);

            QString url = list.at(i)->url;

            //qDebug()<< "get " + url;

            QNetworkReply* reply = manager->get(QNetworkRequest(QUrl(url)));
            connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished_listDesc(QNetworkReply*)));
            connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress_listDesc(qint64,qint64)));
            connect(reply, SIGNAL(finished()), this, SLOT(finished_listDesc()));
            connect(reply, SIGNAL(readyRead()), this, SLOT(readyRead_listDesc()));
            this->listReplies.append(reply);
        }
}

пытаюсь удалить объекты

Код:
void Class1::stop()
{
    abort = true;

    for(int i=0; i < listReplies.count(); i++)
    {
        QNetworkReply *reply = (QNetworkReply *)listReplies.at(i);
        reply->disconnect();
        reply->manager()->disconnect();
        reply->abort();
        reply->deleteLater();
        reply->manager()->deleteLater();
    }
}

ответ обрабатывается примерно так

Код:
void Class1::replyFinished_listDesc(QNetworkReply* reply)
{
    if(abort)
    {
        return;
    }

.......

}
удаляю объекты класса, падает на delete, есть подозрение, что запрос еще не завершился (притом самый последний)

Код:
    for(int i=0; i< list.count(); i++)
    {
        Class1* t = (Class1*)list.at(i);
        t->stop();
        delete t;
    }

куда копать?
Записан
kambala
Джедай : наставник для всех
*******
Online Online

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 14, 2011, 16:57 »

вынеси объявление MyNetworkAccessManager за цикл; удаляй элементы из списка с помощью метода take, а после уже удаляй сам элемент через delete
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
majatu
Гость
« Ответ #2 : Октябрь 14, 2011, 21:54 »

сделано, НО "sigsegv segmentation fault" при reply->deleteLater();
Записан
kambala
Джедай : наставник для всех
*******
Online Online

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Октябрь 14, 2011, 22:54 »

точно take-аешь элемент из списка перед удалением?

поскольку менеджер у тебя всего один, то вызывать reply->manager()->deleteLater() в цикле нельзя

и зачем явно вызывать disconnect()?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
majatu
Гость
« Ответ #4 : Октябрь 15, 2011, 12:23 »

сделано, решение проблемы такое: только один QNetworkAccessManager, установка для него parent в 0, для QNetworkReply setpParent (указатель на QNetworkAccessManager)

disconnect я думал ставить, так как возможно еще шли сигналы и поэтому он падал
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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