私はバックグラウンドでイメージ取得を行うワーカークラスを持っています。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()
はスロットで、workFinished
は信号です。
は、だから私のUIクラスでは、私は労働者を起動すると、私はスロットに信号を接続します
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();
この時点で、私はスロット、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()
を実装しましたブロックしています。信号quit()
が
おかげ
編集emmitedされている場合でも:acq::~acq()
に
connect(m_worker, SIGNAL(workFinished()), m_worker, SLOT(deleteLater()));
connect(m_thread, SIGNAL(finished()), m_thread, SLOT(deleteLater()));
とQdebugメッセージを証明するように印刷されています
を私はこれらの2つの接続を追加しましたそのストップが呼び出され、workFinishedが送出され、deleteLater()が送出されます。
デバッガを使用して、待機しているスレッドが実際に終了したことを確認しましたか?終了していない場合はどうしていますか? – UKMonkey