[英]QThread: slot quit() is never invoked and hence the thread wait() is forever
我有與所描述的完全相同的問題QThread 不會停止/不處理信號但有一個扭曲。 即使將QCoreApplication::processEvents()
用於我的 while 循環,我也無法讓它工作。 我關注了這篇博文,結果如下:
媒體控制器.cpp
void MediaController::buttonPlayClicked(bool checked)
{
if (checked)
{
m_loopThread = new QThread;
m_playPauseworker = new PlayPauseWorker;
m_playPauseworker->moveToThread(m_loopThread);
connect(m_playPauseworker, &PlayPauseWorker::dataReady, this, &MediaController::onDataReady);
connect(m_loopThread, &QThread::started, m_playPauseworker, &PlayPauseWorker::process);
connect(m_playPauseworker, &PlayPauseWorker::finished, m_loopThread, &QThread::quit); // <-- never works
connect(m_playPauseworker, &PlayPauseWorker::finished, m_playPauseworker, &PlayPauseWorker::deleteLater);
connect(m_loopThread, &QThread::finished, m_loopThread, &QThread::deleteLater);
m_loopThread->start();
}
else
{
m_loopThread->requestInterruption();
}
}
每次單擊播放/暫停可檢查按鈕時都會調用上述插槽。 線程和工作者是在主線程上創建的。
PlayPauseWorker.cpp
void PlayPauseWorker::process()
{
while (!QThread::currentThread()->isInterruptionRequested())
{
// heavy computations
emit dataReady(std::tuple<QImage, QImage, QImage>>); // <-- works!
QCoreApplication::processEvents(); // <-- doesn't help with quit()
}
emit finished(); // <-- emits the signal but quit() not called
}
在進一步處理中,當我訪問wait()
以查看我的線程是否已退出時,它永遠不會返回。
除了從未調用過的quit()
插槽外,我注意到當線程運行時我的 GUI 變得非常不穩定。 我有時可以/不能點擊其他按鈕或玩 UI。 我瀏覽了很多 SO 帖子,但無法找到一種在需要時干凈地退出線程的方法。 不知道我哪里錯了。
在嘗試了很多建議之后,我仍然無法弄清楚為什么emit finished()
不會退出線程。 因此,作為最后的手段,我使用this->thread->quit()
來實現相同的目的。
但是感謝這里的所有評論者,我縮小了滯后/不穩定的 gui 問題。 我的emit data(std::tuple<QImage, QImage, QImage>>)
在循環上設置QGraphicsScene
上的像素圖,而沒有刪除場景上已經設置的像素圖,導致巨大的 memory 泄漏並最終崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.