Russian Qt Forum

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



Название: Удаление объектов Qt 4.0.1
Отправлено: Druxa от Октябрь 16, 2005, 14:47
В моей программе есть класс, который качает файлы через http. Создаётся объект:
Код:

http = new QHttp;    
http->setHost(fromHost);
http->get("/" + fileName, &file);
http->closeConnection();
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));

void downloadFiles::httpDone(bool error)
{
if (error) {
file.remove();
emit httpDownloadError();
}
else {
file.close();
emit httpDownloadOk();
}
}

Деструктор:
downloadFiles::~downloadFiles()
{
    delete http;
}


Так вот! Когда я создаю объект loadFiles = new downloadFiles(mainHost, "", "users.txt");, а затем если удаляю его при возникновении сигнаола httpDownloadError() приложение зависает. Если удалять объект при httpDownloadOk(), т.е. когда файл успешно скачался, ни каких проблем не возникает. Сначало я подумал, что если генерируется сигнал ошибки, то в классе Qhttp предусмотрено удаление объекта по умолчанию, но если я вручную не удаляю объект при возникновении ошибки скачивания оперативная память пропадает, если пытаться повторять процедуру при отсутствии соединения с интернетом(т.е. генерируется httpDownloadError()), то память пропадает всё больше и больше! Что длать? как правильно сконструировать деструктор?


Название: Удаление объектов Qt 4.0.1
Отправлено: oktogen от Октябрь 18, 2005, 10:16
Мне кажется, до срабатывания деструктора, нужно разорвать
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));


Название: Удаление объектов Qt 4.0.1
Отправлено: Druxa от Октябрь 18, 2005, 16:18
Цитата: "oktogen"
Мне кажется, до срабатывания деструктора, нужно разорвать
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));

Почему тогда при done(bool), где bool=true деструктор уничтожает объект и не происходит никаких ошибок, память отчищается?


Название: Удаление объектов Qt 4.0.1
Отправлено: oktogen от Октябрь 19, 2005, 12:39
Трудно понять так сразу.
Мне кажется общий вид проблемы таков.
Ты удаляешь объект, после этого проходит этот сигнал и
срабатывает слот, который обращается к функциям и переменным  уже удаленного объекта. Естественно, результат будет непредсказуемым.


Название: Удаление объектов Qt 4.0.1
Отправлено: oktogen от Октябрь 19, 2005, 12:42
Посмотри, слот, который связан с сигналом HttpDownloadError().
Возможно там проблема


Название: Удаление объектов Qt 4.0.1
Отправлено: Druxa от Октябрь 20, 2005, 00:52
Цитата: "oktogen"
Посмотри, слот, который связан с сигналом HttpDownloadError().
Возможно там проблема

Я удаляю объект в слоте SLOT(connectError()), слот срабатывает при возникновении сигнала HttpDownloadError() моего объекта, так что всё должно корректно удаляться.
 
Код:

loadFiles = new downloadFiles(mainHost, "sysFiles", "filesinfo.txt");
connect(loadFiles, SIGNAL(httpDownloadOk()), this, SLOT(internetConnectOk()));
connect(loadFiles, SIGNAL(httpDownloadError()), this, SLOT(connectError()));

В случае httpDownloadOk() объект удаляется без ошибок.


Название: Удаление объектов Qt 4.0.1
Отправлено: oktogen от Октябрь 20, 2005, 10:16
Приведи  текст слота connectError(). Желательно весь.