【发布时间】:2012-10-13 07:44:27
【问题描述】:
我正在编写一个具有 X11/Xlib 接口的程序,我的事件处理循环如下所示:
while (XNextEvent(display, &ev) >= 0) {
switch (ev.type) {
// Process events
}
}
问题是当窗口调整大小时,我收到一堆Expose 事件告诉我要重绘窗口的哪些部分。如果我直接响应事件重绘它们,重绘操作会非常滞后,因为它太慢了(调整大小后,我会看到所有新失效的矩形一个一个刷新。)
我想做的是在更新的窗口大小发生变化时记录它,并且当没有更多事件需要处理时,只在整个窗口(或至少只有两个矩形)上运行一次重绘操作。
很遗憾,我看不到这样做的方法。我试过这个:
do {
XPeekEvent(display, &ev);
while (XCheckMaskEvent(display, ExposureMask | StructureNotifyMask, &ev)) {
switch (ev.type) {
// Process events, record but don't process redraw events
}
}
// No more events, do combined redraw here
}
这确实有效,但效率有点低,如果一个我对XCheckMaskEvent 调用不感兴趣的事件到达,它不会从队列中删除它,所以它会停留在那里阻止XPeekEvent 阻塞,导致 100% 的 CPU 使用率。
我只是想知道是否有一种标准方法可以实现我所追求的延迟/组合重绘?许多 Xlib 事件处理函数似乎会阻塞,因此如果您想在它们阻塞之前进行一些处理,它们并不适合使用,但前提是它们会阻塞!
编辑:为了记录,这是我使用的解决方案。这是 n.m. 的简化版:
while (XNextEvent(display, &ev) >= 0) {
switch (ev.type) {
// Process events, remember any redraws needed later
}
if (!XPending(display)) {
// No more events, redraw if needed
}
}
【问题讨论】: