Ich habe eine Arbeiterklasse, die Bilderfassung im Hintergrund machen.Richtig beenden QThread
void acq::run()
{
while (m_started)
{
blocking_call();
}
emit workFinished();
}
void acq::start()
{
m_started = true;
run();
}
void acq::stop()
{
m_started = false;
}
start()
; stop()
sind Steckplätze und workFinished
ist ein Signal.
Also in meinem UI-Klasse, ich den Arbeiter zu starten und ich verbinden die Signale an die Steckplätze:
m_thread = new QThread;
m_worker = new acq();
m_worker->moveToThread(m_thread);
// When the thread starts, then start the acquisition.
connect(m_thread, SIGNAL (started()), m_worker, SLOT (start()));
// When the worker has finished, then close the thread
connect(m_worker, SIGNAL(workFinished()), m_thread, SLOT(quit()));
m_thread->start();
An diesem Punkt setzte ich den Schlitz, closeEvent
void UIClass::closeEvent (QCloseEvent *event)
{
m_worker->stop(); // tell the worker to close
m_thread->wait(); // wait until the m_thread.quit() function is called
event->accept(); // quit the window
}
Unfortanely, m_thread->wait()
blockiert. Selbst wenn das Signal quit()
wird
Dank
edit:
Ich habe diese beiden Anschlüsse:
connect(m_worker, SIGNAL(workFinished()), m_worker, SLOT(deleteLater()));
connect(m_thread, SIGNAL(finished()), m_thread, SLOT(deleteLater()));
und ein qDebug in acq::~acq()
Die Nachricht wird gedruckt, das beweisen , dieser Stopp wird aufgerufen, workFinished wird ausgegeben, deleteLater() wird ausgegeben.
Haben Sie Ihren Debugger verwendet, um sicherzustellen, dass der Thread, auf den Sie warten, tatsächlich beendet wurde - und wenn er nicht beendet wird, was er tut? – UKMonkey