【问题标题】:Temporarily stop Qt5/QML from updating framebuffer (/dev/fb0)暂时停止 Qt5/QML 更新帧缓冲区 (/dev/fb0)
【发布时间】:2017-10-13 15:07:48
【问题描述】:

在嵌入式系统上,由于非常具体的硬件/软件限制,我们需要另一个程序能够通过帧缓冲区 (/dev/fb0) 显示信息,同时保持我们的 Qt5/QML 程序在后台运行。 第二个程序运行时,我们在 QML 中显示了一个自定义 QQuickItem 派生的黑色矩形(在 update() 中只有一个“返回”),但我们仍然看到 LCD 显示屏上闪烁。
我们推测 QT 仍在将 Screen Graph(可能是位于矩形下方的其他项目)绘制到 /dev/fb0,从而导致两个程序同时写入 /dev/fb0 时出现闪烁。
我们不能使用第二种帧缓冲方法 (/dev/fb1),因为合成会显着增加处理器负载,从而使系统变得不可用。
一种想法是遍历屏幕图树,将所有节点的“ItemHasContents”标志标记为 false,因此屏幕图形渲染器不会写入 FB,然后在辅助程序完成其任务时重新启用。
另一个想法是通过顶级 QWindow 关闭渲染,但文档中没有任何内容说这甚至是可能的...... 这可以通过 QT 实现,还是通过 shell 脚本实现?

【问题讨论】:

  • 你试过在顶级QWindow上调用setVisible(false)吗?
  • 也许值得研究从 UI 线程进行长时间阻塞函数调用是否会阻止应用程序写入帧缓冲区。在超时和继续之前,使用 select() 来阻止观看 stdin 所需的毫秒数。对不起,我无法尝试,我没有使用 qt 直接连接到 fb 的设备
  • 或者让第二个进程使用kill -STOPkill -CONT 暂停Qt 应用程序。不过,如果 Qt 应用程序是通过 IO 访问的一半,这听起来有点危险。显然,如果 Qt 应用程序需要在此时间间隔内保持任何实时活动,那么这些都不可接受
  • 是否可以使用 setRenderTarget() 暂时让 Qt 应用程序写入屏幕外帧缓冲区

标签: linux qt embedded qml framebuffer


【解决方案1】:

/dev/fb0 听起来您正在使用基于 Linux 的系统。

您并不是说您是否需要 Qt 应用程序真正继续运行,而无需屏幕更新,或者在您的其他应用程序使用帧缓冲区时简单地“冻结”它是否就足够了。

如果您对后者没问题,阻止 Qt 应用程序渲染的最简单解决方案是简单地向它发送一个 SIGSTOP 信号,它将冻结并停止升级帧缓冲区。完成 fb 后,发送一个 SIGCONT 信号。有时最简单的方法是最好的……

【讨论】:

  • 我们实际上需要它运行,这就是我们试图避免 SIGSTOP?SIGCONT 路由的原因。我们有一些通信线程可以在后台保持活动,它们需要满足一些关键的时序要求。
  • @tofro 你能告诉我如何处理前一个要求吗?我的意思是我有 2 个 QT 应用程序,1 个使用 XCB 插件(使用 DRM/KMS)运行,另一个使用 Framebuffer。当我通过执行 chvt 切换到帧缓冲区 QT 应用程序时,它可以工作。但是我不能通过执行 chvt 1 回到 QT XCB 应用程序。关于如何在不同的 tty 中并行运行这两个应用程序并来回切换有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2011-06-17
  • 2012-05-25
  • 2015-12-04
  • 2014-10-17
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
相关资源
最近更新 更多