我维护一个gtk3(虽然是gtk2hs和gi-gtk的混合)应用程序,它作为一个独立的状态栏,用于平铺窗口管理器,称为taffybar。
Taffybar有一个长期存在的错误,其中发生的某些事情导致其中一个窗口(它可以有多个窗口,例如在多个监视器上显示时)以完全停止更新(issue here)。我已经通过各种日志记录机制验证了应该更新窗口IS的代码实际上继续运行。此外,如果taffybar显示在多个窗口上,窗口将一次受到影响 - 也就是说,挂起似乎只影响它发生的窗口,这排除了UI线程上发生的任何奇怪事情或类似的东西
不幸的是,我没有一致的方法来重现这个问题。更糟糕的是,我甚至无法想出一种以编程方式检测问题的方法。有了这个说,发现问题相对容易,因为最近添加了新的图标加载机制已经变得更糟(在最新版本中似乎每5分钟发生一次)。这让我想起另一件事我应该提到的是我相对肯定这个问题与pixbufs和图像显示有关,因为我从未见过当工作区图像模块不活动时会出现问题。
我讨厌问一个问题,甚至无法提供一致的方法来重现这个问题,但我只是不知道如何解决/调试这个问题。实际上,我很难想象我所描述的行为是如何实现的。我希望关于这个问题的特殊性质的某些内容可能对于那些比我更了解的人来说已经足够猜测这个问题可能是什么了。
为了尽可能明确地提出我的问题,我会将其说成如下:
什么可能导致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
我有时会从图标主题加载图标
答案 0 :(得分:0)
我认为导致此问题的原因仅仅是主UI线程未执行某些UI更新。我无法百分百地确定这一点,因为我从未能够繁殖。有关更多详细信息,请参见此评论:
https://github.com/taffybar/taffybar/issues/228#issuecomment-402591159