QThread:永远不会调用slot quit,因此线程wait是永远的

问题描述

我遇到了与QThread won't stop / does not process a signal完全相同的问题,但有一个问题。即使QCoreApplication::processEvents()进入while循环,我也无法正常工作。我遵循了这个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::deleteLater);
        connect(m_loopThread,&QThread::finished,&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上设置像素图,而没有删除场景中已经设置的像素图,从而导致大量内存泄漏并最终崩溃。