Есть класс окна, в полях которого имеются два свойства:
protected:
QThread moveDetectorThread; // Объект потока
MoveDetector moveDetector; // Некий объект для запуска в потоке
В конструкторе есть следующий код, и он нормально запускает объект в потоке:
// Запуск цикла объекта при старте потока
connect(&moveDetectorThread, &QThread::started, &moveDetector, &MoveDetector::run);
// Соединения для корректного завершения потока
connect(&moveDetector, SIGNAL(finished()), &moveDetectorThread, SLOT(quit()));
connect(&moveDetector, SIGNAL(finished()), &moveDetector, SLOT(deleteLater()));
connect(&moveDetectorThread, SIGNAL(finished()), &moveDetectorThread, SLOT(deleteLater()));
moveDetector.moveToThread(&moveDetectorThread); // Объект переносится в тред
moveDetectorThread.start(); // Тред запускается
Сам объект имеет метод основного цикла и метод, устанавливающий флаг выхода:
void MoveDetector::run()
{
exitFlag=false;
for(;;){
update();
if(exitFlag) {
emit finished();
return;
}
}
}
void MoveDetector::doExit()
{
exitFlag=true;
}
В деструкторе окна я написал такой код:
moveDetector.doExit();
while(!moveDetectorThread.isFinished()) {
qDebug() << "Wait finished move detector...";
}
В результате, при срабатывании деструктора программа крешится вот так:
Wait finished move detector...
[vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Wait finished move detector...
Wait finished move detector...
Wait finished move detector...
The program has unexpectedly finished.
Процесс был завершён принудительно.
/home/xi/work/develop/cpp/MoveNoid/build-MoveNoid-Desktop_Qt_5_9_2_GCC_64bit-Debug/MoveNoid crashed.
Информацию брал вот отсюда: https://habrahabr.ru/post/150274/
Вопрос: почему крешится программа? Что сделать чтоб поток нормально завершался?
UPD: Сделал минимальный пример: http://rgho.st/8dD7n4ljc
При нажатии Stop все зависает, окно перестает отвечать.