Russian Qt Forum

Qt => Работа с сетью => Тема начата: majatu от Октября 14, 2011, 15:47



Название: падает приложение при удалении QNetworkAccessManager
Отправлено: 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;
    }

куда копать?


Название: Re: падает приложение при удалении QNetworkAccessManager
Отправлено: kambala от Октября 14, 2011, 16:57
вынеси объявление MyNetworkAccessManager за цикл; удаляй элементы из списка с помощью метода take, а после уже удаляй сам элемент через delete


Название: Re: падает приложение при удалении QNetworkAccessManager
Отправлено: majatu от Октября 14, 2011, 21:54
сделано, НО "sigsegv segmentation fault" при reply->deleteLater();


Название: Re: падает приложение при удалении QNetworkAccessManager
Отправлено: kambala от Октября 14, 2011, 22:54
точно take-аешь элемент из списка перед удалением?

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

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


Название: Re: падает приложение при удалении QNetworkAccessManager
Отправлено: majatu от Октября 15, 2011, 12:23
сделано, решение проблемы такое: только один QNetworkAccessManager, установка для него parent в 0, для QNetworkReply setpParent (указатель на QNetworkAccessManager)

disconnect я думал ставить, так как возможно еще шли сигналы и поэтому он падал