2017-10-13 47 views
1

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

+0

你有没有打过电话'调用setVisible在顶层QWindow(假)'? –

+0

也许值得研究是否从UI线程进行长阻塞函数调用将停止应用程序写入帧缓冲区。就像使用select()来阻止观看stdin所需的ms数,然后超时并继续。对不起,我无法尝试它,我没有使用qt的设备直接使用fb –

+0

或者让第二个进程使用'kill -STOP'和'kill -CONT'来暂停Qt应用程序。这听起来有点危险,但如果Qt应用程序是通过IO访问的一半。显然,如果Qt应用程序需要在此间隔期间保持任何实时活动,则这两者都不可接受 –

回答

0

/dev/fb0听起来像你会在基于Linux的系统上工作。

你并不是说你是否需要Qt应用程序真的继续运行,没有屏幕更新,或者只是“冻结”它,而其他应用程序使用帧缓冲区就足够了。

如果你对后者很满意,停止Qt应用程序渲染的最简单的解决方案是发送一个SIGSTOP信号,它会冻结并停止升级帧缓冲区。一旦你完成了fb,发送一个SIGCONT信号。有时,最简单的方法是最好的...

+0

临时让Qt应用程序写入离屏帧缓冲区我们实际上需要它运行这就是我们试图避免使用SIGSTOP?SIGCONT路由的原因。我们有一些通信线程可以让事情保持在后台,并且需要满足一些关键的时序要求。 – Gio