我将PyGTK3 [python3.7,Debian 9.7 @ x86_64,Gtk 3.22.11]用于嵌入式UI [X11,Xfce4,信息亭模式]。
我注意到一段时间后,UI“冻结”:无论调用Gtk调用如何,UI项都不再重绘。
最初,我认为主循环由于某种原因而卡住了,但绝对不是:执行继续,应用程序线程和UI线程保持日志记录。我还添加了一个计时器(GLib.timeout_add
),该计时器一直以定义的速度被调用。
我再次检查了从应用程序线程到Gtk循环的所有调用都直接通过GLib.idle_add
进行;从Gtk接收到的所有事件都被推送到应用程序线程管理的事件队列中,以避免可能从主上下文进行任何长时间的调用。
任何关于如何调试此类问题的提示都将不胜感激,因为我没有想法。 GDB在测试平台上可用,尽管我不确定如何从那里跟踪此问题。
有关此问题的其他详细信息:
UI项包括几个文本标签,一个进度条和两个基本绘图区域,它们包含在笔记本的页面中。该应用程序以全屏模式[800x480]运行。
我以某种自动测试模式运行该应用程序,一次又一次地运行相同的序列,直到冻结为止,而无需任何用户输入-也不存在任何输入事件。
冻结时,应用程序不会崩溃,UI冻结时,CPU也不会显示明显的负载。
UI从5到100个周期“冻结”冻结。每个周期持续约4秒。一个周期对Gtk API的调用少于一百次。
用户界面提供了一个退出应用程序的模式对话框,可以从主菜单栏中插入该对话框。当UI冻结时,例如尚未提供许多更改文本标签内容,进度条分数值等的调用,但仍显示对话框。有时,其内容绘制成功,有时仅显示对话框框架(包括按钮)及其标题文本,而未(重新)绘制对话框内容区域...
什么会导致这种麻烦,UI不再刷新,但主要上下文似乎已启动并运行?