【发布时间】:2023-04-07 17:13:01
【问题描述】:
我注意到,对于较旧的 X 程序,当用户开始通过拖动窗口边缘来调整窗口大小时,操作系统的整个 GUI 会冻结。
我正在使用 glxgears 进行测试 - 齿轮停止旋转。所有其他程序的内容更新也是如此 - 例如任务管理器、终端窗口等。
停止移动鼠标后,所有活动重新开始。
调整新程序窗口的大小(我的意思是使用 GTK 或 Qt)不会冻结任何东西。
同时,旧程序的 GUI 比新程序的响应速度更快。只有拖动调整大小是问题。
较旧的程序都使用标准的文档化方式来处理消息队列。类似于以下内容(当然更复杂):
while (1) {
XNextEvent(d, &e);
if (e.type == Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));
}
}
我试图通过在主窗口创建时设置XSetWindowAttributes.event_mask = 0 来消除整个消息处理。事件完全停止流动,但在调整空窗口大小时,所有 GUI 仍然冻结。
因此,问题不(仅)在客户端。虽然,它可能是客户端和服务器交互的方式。例如,可能是因为客户端没有做某事。
那么,较新的工具包有何不同之处?在旧程序中进行哪些更改以避免此类冻结。
【问题讨论】:
-
不确定,但我猜至少有一些差异是由于在许多当前基于
X11的应用程序中使用libxcb而不是XLib。它的级别更低,更异步(或“不那么同步”——任你选择)。 -
@G.M.是的,但是据我所知,最新版本的 Xlib 实际上也是基于 xcb 的。所以,应该没有区别。或者好吧,Xlib 实现中存在一些错误......但是,即使没有调用任何 Xlib 函数,外部操作(来自窗口管理器)也会导致整个系统冻结......
-
@G.M.好吧,我尝试编译仅使用 xcb(来自 en.wikipedia/xcb)的简单示例,它以相同的方式挂起 GUI... :(