如何解决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
上设置像素图,而没有删除场景中已经设置的像素图,从而导致大量内存泄漏并最终崩溃。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。