QThread:永远不会调用 slot quit(),因此线程 wait() 永远存在

QThread: slot quit() is never invoked and hence the thread wait() is forever

我遇到的问题与 QThread won't stop / does not process a signal but with a twist. I cannot get it to work even with QCoreApplication::processEvents() to my while loop. I followed this blog post 描述的完全相同,结果如下:

MediaController.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();
    }
}

每次单击 play/pause 可检查按钮时都会调用上述插槽。 Thread 和 worker 在主线程上创建。

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() 以查看我的线程是否已退出时,它从未 returns。

除了从未调用过 quit() 插槽外,我注意到当线程为 运行 时我的 GUI 变得非常不稳定。我有时 can/cannot 单击其他按钮或玩 UI。我浏览了很多 SO 帖子,但无法想出一种方法来在需要时干净地退出线程。不知道我哪里错了。

在尝试了很多建议后,我仍然无法弄清楚为什么 emit finished() 不退出线程。因此,作为最后的手段,我使用 this->thread->quit() 来实现相同的目的。

但感谢这里的所有评论者,我缩小了 laggy/choppy gui 问题的范围。 我的 emit data(std::tuple<QImage, QImage, QImage>>)QGraphicsScene 上循环设置像素图,而没有删除场景中已经设置的像素图,导致巨大的内存泄漏并最终崩溃。