Проблема в том, что aboutToQuit
не ждет, когда рабочий закончит работу.Вы должны явно подождать, пока он сделает это:
connect(this, &MyApplication::aboutToQuit,
this, &MyApplication::stopWorker);
// also, change up your connects a little to make shure everything gets deleted properly
connect(m_worker, &MyWorker::finished,
m_threadWorker, &QThread::quit,
Qt::DirectConnection); //direct connection is needed, because you are blocking the main thread by waiting
connect(m_threadWorker, &QThread::finished,
m_worker, &MyWorker::deleteLater);
MyApplication::stopWorker() {
QMetaObject::invokeMethod(m_worker, "quit");
m_threadWorker->wait();
m_threadWorker->deleteLater();
}
Это, однако, "заморозит" ваше приложение, ожидая, пока работник завершит работу.Если вы хотите оставаться отзывчивым во время ожидания, вместо этого используйте локальный QEventLoop
внутри MyApplication::stopWorker
и используйте его как:
MyApplication::stopWorker() {
QEventLoop stopLoop;
connect(m_threadWorker, &QThread::finished,
&stopLoop, &QEventLoop::quit);
QMetaObject::invokeMethod(m_worker, "quit");
stopLoop.exec();
m_threadWorker->deleteLater();
}