【发布时间】:2026-02-14 08:05:02
【问题描述】:
tl;dr:我有一个 QThread,只要有新数据可供处理,它就会向主线程发送一个信号。然后主线程获取、处理和显示数据。数据到达的频率更高,主线程能够对其进行处理,从而导致 GUI 冻结并最终导致堆栈溢出(耶!)。
详情
我的应用程序从相机获取帧以进行处理和显示。当新帧可用时,相机会通过 windows 事件进行通知。我有一个线程定期检查这些事件并在新帧可供抓取时通知主线程:
void Worker::run()
{
running_ = true;
while (running_)
{
if (WaitForSingleObject(nextColorFrameEvent, 0) == WAIT_OBJECT_0)
emit signalColorFrame();
usleep(15);
}
}
signalColorFrame 连接到Camera 类中的插槽,该插槽从相机获取帧,进行一些处理并将其发送到MainWindow,后者将其绘制到屏幕上。
void Camera::onNewColorFrame()
{
getFrameFromCamera();
processFrame();
drawFrame();
}
现在,如果该方法在下一帧可用之前完成,则一切正常。随着处理变得越来越复杂,尽管Camera 类在处理前一帧之前接收到新信号。
我的解决方案是在处理时阻止来自工作线程的信号,并强制偶数循环在 QCoreApplication::processEvents() 之间运行:
void Camera::onNewColorFrame()
{
worker_->blockSignals(true)
getFrameFromCamera();
processFrame();
drawFrame();
QCoreApplication::processEvents(); // this is essential for the GUI to remain responsive
worker_->blockSignals(false);
}
这看起来是一种好方法吗?有人可以提出更好的解决方案吗?
【问题讨论】:
-
好的,我删除了关于此解决方案不可靠的部分,因为那是由于我的错误。它几乎可以按预期工作。
标签: c++ multithreading qt video-streaming kinect