gpt4 book ai didi

multithreading - Qt C++ 如何不向我的 UI 线程发送垃圾信号

转载 作者:行者123 更新时间:2023-12-04 06:49:03 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

你有一个经典single producer - single consumer (SPSC)问题。

消费者(显示线程)确信在某个时刻缓冲区中会有帧。确实不需要通知它。它可以检查是否有一些内容要为自己显示,以自己的速度(帧率)。

您可以实现双(三,...)缓冲:在线程之间共享帧队列,在一端消耗(显示)帧,将另一端生成的帧排队。

使生产者端的一帧不可消耗,以避免显示部分生产的帧。如果只剩下两个帧,一个刚刚显示的帧和一个当前正在生成的帧(生产者无法跟上消费者),则重复显示已经显示的内容,和/或让消费者休眠(降低帧率,“滞后”)。如果队列已满,则另一种方式。您也可能有两个(三个,...)缓冲区,您可以在消费者和生产者之间切换。

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

关于multithreading - Qt C++ 如何不向我的 UI 线程发送垃圾信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34302076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com