PavelK
@PavelK

QThread почему не вызывается деструктор класса?

Приветствую!

Создал новый класс FindTargets , унаследованный от QObject
с потоком работаю в классе AppCore в конструкторе:
ft = new FindTargets(0);
thread = new QThread(0);
connect(thread, SIGNAL(started()), ft, SLOT(process()));
connect(ft, SIGNAL(finished()), thread, SLOT(quit()));
connect(ft, SIGNAL(finished()), ft, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
ft->moveToThread(thread);
thread->start();


в десструкторе:
AppCore::~AppCore()
{
   qDebug()<<"AppCore::~AppCore";
   ft->stop();
}


В классе FindTargets бесконечный цикл while который как только остановится сигналит finished() и функция stop(), которая непосредственно останавливает его .

Для завершения работы программы создал связь:
QObject::connect(&app, SIGNAL(aboutToQuit()), appCore, SLOT(deleteLater()));

НО деструктор FindTargets::~FindTargets() не вызывается

Вывод:
AppCore::~AppCore //-- сработал десструктор основного класса
FindTargets::stop //-- сработал stop()

на этом программа завершается (действительно завершается, процессов висящих нет!)

Если я в другом месте вызову ft->stop(), то десструктор FindTargets::~FindTargets вызван будет.

Подскажите, пожалуйста, почему не вызывается десструктор FindTargets::~FindTargets ??
  • Вопрос задан
  • 827 просмотров
Решения вопроса 1
PavelK
@PavelK Автор вопроса
В общем, нашёл решение.
Проблема была в том, что поток и рабочий класс создавался в классе, который сам убивается при закрытии последнего окна проги, а так как всё было подключено через сигналы-слоты, они переставали вызываться. Стоило только оставить жить основной класс после закрытия окна, то всё пришло в норму, ну только добавил, что бы основной класс убивался, когда поток закончил работы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы