Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Qt C++;我如何不向我的UI线程发送垃圾邮件_Multithreading_Qt - Fatal编程技术网

Multithreading Qt C++;我如何不向我的UI线程发送垃圾邮件

Multithreading Qt C++;我如何不向我的UI线程发送垃圾邮件,multithreading,qt,Multithreading,Qt,我有一个摄像头,我正在从中检索实时视频源,并将其显示在QGraphicsView中。这个UI有一些按钮,我想用它们来改变相机的焦距,但在我单击按钮并向处理实时视频图像的线程发射emit()后,UI会挂起/冻结 我找到的解决方案是在处理线程中进行某种等待,以减少发送到UI线程的emits()数量。这很有效,它允许我在QGraphicsView中显示实时视频图像,同时还可以与UI按钮交互,将emits()发送到线程以更改焦点 但这确实显著地改变了实时视频提要的刷新率。我的问题是,当我想向处理线程发送

我有一个摄像头,我正在从中检索实时视频源,并将其显示在QGraphicsView中。这个UI有一些按钮,我想用它们来改变相机的焦距,但在我单击按钮并向处理实时视频图像的线程发射emit()后,UI会挂起/冻结

我找到的解决方案是在处理线程中进行某种等待,以减少发送到UI线程的emits()数量。这很有效,它允许我在QGraphicsView中显示实时视频图像,同时还可以与UI按钮交互,将emits()发送到线程以更改焦点


但这确实显著地改变了实时视频提要的刷新率。我的问题是,当我想向处理线程发送信号时,如何在QGraphicsView中显示实时视频图像而不导致UI崩溃。我真的很想得到可能的帧速率。

在每个帧上发送垃圾邮件可能不是一个好主意

你有一个典型的问题

使用者(显示线程)确信在某个点缓冲区中会有帧。没有必要通知它。它可以用自己的速度(帧速率)检查是否有一些内容可以自己显示

您可以实现双重(三重,…)缓冲:在线程之间共享帧队列,在一端使用(显示)帧,从另一端将生成的帧排队

在生产商一侧制作一个非消耗性框架,以避免显示部分生产的框架。如果只剩下两个帧,即刚刚显示的帧和当前正在生成的帧(生产者无法跟上消费者),则重复显示已经显示的帧,和/或使消费者睡眠(降低帧率,“滞后”)。如果队列已满,则使用其他方法。您还可以在消费者和生产者之间切换两(三,…)个缓冲区


SPSC队列已知高效的无锁实现(如中的一个)。

听起来您的代码好像有问题。线程间信号是异步的,它们是排队的,它们不应该崩溃或阻塞UI线程,在典型的帧速率中,每帧几个信号也不应该是问题。发布一个代码示例,重新创建您的问题,以便人们可以看到您做错了什么。如何呈现在UI线程中接收到的图像?如果您转换为QPixmap或类似的东西,瓶颈可能就在那里。考虑直接渲染到OpenGL。在用QGraphicsView解决QT中的SPSC问题后,我最终选择了OpenGL。OpenGL是一个很好的选择。