TL;博士:我有一个QThread的当新数据可用于处理将信号发送到主线程。主线程然后获取,处理和显示数据。主线程可以更频繁地处理数据,导致冻结的GUI并最终导致堆栈溢出(yay!)。如何从另一个线程处理信号洪水的Qt
详细
我的应用程序获取帧从照相机,用于处理和显示。相机通过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);
}
不会看起来像做这件事的好方法吗?有人可以提出更好的解决方案吗
好吧,我删除了这个解决方案是不可靠的零件,因为这是由于我的失误。它非常符合预期。 – jaho 2013-04-20 15:34:03