我有一个相机,我正在检索实时视频输入,并在QGraphicsView中显示它.这个UI有我想用来改变相机焦点的按钮但是在我点击按钮并向处理实时视频图像的线程发射一个emit()后,UI挂起/冻结.
我找到的解决方案是在我的处理线程中放置一些等待来减少发送到UI线程的emits()的数量.这很有效,它允许我在QGraphicsView中显示实时视频图像,同时还能够与UI按钮交互以将emits()发送到线程以更改焦点.
这确实显着改变了实时视频源的刷新率.我的问题是如何在QGraphicsView中显示实时视频图像,而不会在想要向该处理线程发送信号时导致UI崩溃.我真的希望得到可能的帧速率.
在每个帧上垃圾邮件可能不是一个好主意.
您有一个经典的单一生产者 - 单一消费者(SPSC)问题.
消费者(显示线程)确定在某个时刻缓冲区中会有帧.不需要通知它.它可以检查是否有一些内容可以自己显示,具有自己的节奏(帧速率).
您可以实现double(triple,...)缓冲:在线程之间共享一个帧队列,在一端使用(显示)帧,从另一端排队生成的帧.
在生产者一侧制作一个非消耗品的框架,以避免显示部分生产的框架.如果只剩下两个帧,刚刚显示的帧和当前正在生成的帧(生产者无法跟上消费者),重复显示已经显示的内容,和/或使消费者睡眠(丢帧率,"滞后").如果队列已满,还有其他方法.您可能还有两个(三个,......)缓冲区,您可以在使用者和生产者之间进行切换.
SPSC队列已知有效的无锁实现(如boost中的一个).