【发布时间】:2019-11-04 20:43:33
【问题描述】:
我们开发了一个集成了摄像头和微控制器的系统。 GUI 显示来自相机的图像和来自微控制器的串行计数,我们使用串行线程来轮询来自微控制器的数据并将信号发送到 GUI 以显示它,并且我们使用单独的线程来捕获图像并将其传递给 main线。 应用程序的问题是当系统处于空闲状态时,GUI 冻结,我们必须重新启动应用程序才能开始工作(空闲的意思是,用户没有租用任何按钮并且计数和图像不断进入)。 这里要注意的最重要的事情是 GUI 冻结问题在这里不一致。安装了几个系统,在某些地方,冻结(无响应)问题每 2/3 周出现一次,在某些地方,每 2 天出现一次。等待应用程序响应没有帮助。
我的主要问题是 GUI 冻结的主要原因是什么,是否有任何检查要在串行线程和图像捕获线程上实施以避免不必要的数据排放。
【问题讨论】:
-
您是否在捕获线程上编写了重采样器,以便主线程不会被传入数据淹没?你监控输入率了吗?
-
@ArneJ 我不确定我是否做到了,你能告诉我如何检查吗?
-
@vallabh 对于初学者,每次捕获线程接收数据时递增一个整数。在另一个线程中,运行一个休眠一秒钟然后打印计数器的循环。现在在渲染(主)线程中做同样的事情。如果您的应用程序稳定,则即使经过长时间的会话,数字也应始终保持不变。
-
如果消费者线程没有足够快地吸收数据,则可能会出现 GUI 冻结问题。 在这种情况下,上述想法也可以提供证明作为修复。生产者(甚至消费者)可能会检查有多少挂起的图像尚未被消费并跳过图像以防万一。
-
@vallabh 是个坏主意,那么您仍在充斥生产者/捕获线程。控制输入速率或重新采样(丢弃一些帧)。
标签: c++ qt opencv serial-port qtgui