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
上循环设置像素图,而没有删除场景中已经设置的像素图,导致巨大的内存泄漏并最终崩溃。
我遇到的问题与 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
上循环设置像素图,而没有删除场景中已经设置的像素图,导致巨大的内存泄漏并最终崩溃。