gtk 窗口停止更新,即使应用程序似乎正在运行

Posted

技术标签:

【中文标题】gtk 窗口停止更新,即使应用程序似乎正在运行【英文标题】:gtk window stops updating, even though application appears to be running otherwise 【发布时间】:2018-11-26 21:18:22 【问题描述】:

我维护了一个 gtk3(虽然是 gtk2hs 和 gi-gtk 的混合体)应用程序,它用作名为 taffybar 的平铺窗口管理器的独立状态栏。

Taffybar 有一个长期存在的错误,即发生某些事情会导致它的一个窗口(它可以有多个窗口,例如在多个显示器上显示时)完全停止更新 (issue here)。我已经通过各种日志机制验证了应该更新窗口的代码实际上仍在继续运行。此外,如果 taffybar 在多个窗口上显示,则窗口将一次受到一个影响——也就是说,挂起似乎只影响它发生的窗口,这排除了 UI 线程上发生的任何奇怪的事情或类似的事情.

很遗憾,我没有一致的方法来重现该问题。更糟糕的是,我什至无法想出一种以编程方式检测问题的方法。话虽如此,由于最近添加了新的图标加载机制(在最新版本中似乎每 5 分钟发生一次),问题变得更糟,因此相对容易发生问题。这提醒我,我应该提到的另一件事是,我相对确定该问题与 pixbufs 和图像显示有关,因为我从未见过在工作区图像模块未激活时出现此问题。

我讨厌在甚至无法提供重现问题的一致方法的情况下提出问题,但我对如何解决/调试此问题感到茫然。我很难想象我所描述的行为实际上是如何可能的。我希望关于这个问题的特殊性质的一些事情可能足以让比我更了解 gtk 的人对问题可能是什么做出一些猜测。

为了使我的问题尽可能明确,我将其表述如下:

什么会导致 gtk 应用程序窗口挂起(停止更新)而不会导致应用程序或 UI 线程崩溃,或影响应用程序创建的任何其他窗口?

编辑:这个错误的另一个有趣的怪癖是即使窗口停止更新,它仍然响应鼠标输入。

EDIT2:另一件值得注意的事情是,我偶尔会收到这样的消息:

gtkicontheme.c:3956:proxy_pixbuf_destroy: assertion failed: (icon_info->proxy_pixbuf != NULL)

当我尝试在代码中销毁挂起的窗口时,我也收到了以下消息:

Source ID 363524 was not found when attempting to remove it

我有时会从图标主题加载图标

【问题讨论】:

你怎么知道它响应鼠标输入? 因为应用程序通过EWMh触发外部行为(本例切换窗口管理器工作区) 鼠标事件处理程序是最顶层 GtkWidget 的一部分吗?如果是,则可能有人取消了第二个小部件。因此没有显示任何内容,但处理程序仍然存在。 Debugging reference count problems 还要仔细检查您是否与主循环中的 gtk not 交互。我最近遇到了一个“我找不到源”和“断言 x != null 失败”的错误,它是由所描述的原因引起的 是的,这是我检查的第一件事,因为它过去一直是问题的根源。这仍有可能,但似乎不太可能。 【参考方案1】:

我认为这个问题的原因仅仅是一些 UI 更新没有在主 UI 线程上执行。我不能 100% 确定这一点,因为我永远无法复制。有关详细信息,请参阅此评论:

https://github.com/taffybar/taffybar/issues/228#issuecomment-402591159

【讨论】:

以上是关于gtk 窗口停止更新,即使应用程序似乎正在运行的主要内容,如果未能解决你的问题,请参考以下文章

GTK+ 接口应该在单独的线程中运行吗?

如何在应用程序中停止位置跟踪?

如何使用 PyGObject 使窗口居中

是否可以在 GTK 中的另一个应用程序中运行一个应用程序?

Java 应用程序抛出`Gtk-WARNING **: cannot open display:` 即使不需要 xserver

实时移动 GTK+ 窗口