簡體   English   中英

QThread: slot quit() 永遠不會被調用,因此線程 wait() 是永遠的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM