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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление объектов Qt 4.0.1  (Прочитано 8543 раз)
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()), то память пропадает всё больше и больше! Что длать? как правильно сконструировать деструктор?
Записан
oktogen
Гость
« Ответ #1 : Октябрь 18, 2005, 10:16 »

Мне кажется, до срабатывания деструктора, нужно разорвать
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
Записан
Druxa
Гость
« Ответ #2 : Октябрь 18, 2005, 16:18 »

Цитата: "oktogen"
Мне кажется, до срабатывания деструктора, нужно разорвать
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));

Почему тогда при done(bool), где bool=true деструктор уничтожает объект и не происходит никаких ошибок, память отчищается?
Записан
oktogen
Гость
« Ответ #3 : Октябрь 19, 2005, 12:39 »

Трудно понять так сразу.
Мне кажется общий вид проблемы таков.
Ты удаляешь объект, после этого проходит этот сигнал и
срабатывает слот, который обращается к функциям и переменным  уже удаленного объекта. Естественно, результат будет непредсказуемым.
Записан
oktogen
Гость
« Ответ #4 : Октябрь 19, 2005, 12:42 »

Посмотри, слот, который связан с сигналом HttpDownloadError().
Возможно там проблема
Записан
Druxa
Гость
« Ответ #5 : Октябрь 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() объект удаляется без ошибок.
Записан
oktogen
Гость
« Ответ #6 : Октябрь 20, 2005, 10:16 »

Приведи  текст слота connectError(). Желательно весь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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