根据手册页,调用XSync(dpy, 1)
会丢弃队列中的事件,但这究竟意味着什么?如果它们没有被丢弃,它们是否被发送了两次(一次通过XSync()
调用,第二次在队列正常清空时)?或者它就像一个垃圾收集器(事件会在稍后被丢弃)?
2 回答
XSync
等待直到请求输出缓冲区被清空(发送到服务器)。如果discard
参数为True
,此函数将丢弃所有排队的事件。这些事件是从 X 服务器接收的。
考虑以下协议交换:
C -> S QueryKeymap request
C <- S ConfigureNotify event
C <- S QueryKeymap reply
您调用了向服务器发送协议消息XQueryKeymap
的客户端应用程序。QueryKeymap
这样做时,您调整了窗口的大小,从而调整了ConfigureNotify
事件。
如果你XSync(display, False)
在你的之后运行XQueryKeymap
,那么客户端将等到收到回复。下一次XPending(display)
调用将返回1
用于上述ConfigureNotify
事件的排队事件的数量。
当XSync(display, True)
被使用时,则XPending(display)
返回0
上述情况。
如果您的代码要被其他人使用,请不要使用True
. 有关使用 时可能出错的示例True
,请参阅http://bugzilla.libsdl.org/show_bug.cgi?id=1859。
似乎您误解了两件事:X 请求与 X 事件,这是不一样的。简而言之:
X 请求:
...客户端应用程序通过此连接向 X 服务器发送请求。这些请求由客户端应用程序中调用的 Xlib 函数发出。...
X 事件:
... 许多 Xlib 函数导致 X 服务器生成事件,而用户键入或移动指针可以异步生成事件。X 服务器向客户端返回事件...
有关更多信息,请查看此- 它非常有帮助。
XSync 以这种方式调用:XSync(dpy, False)
做两件事(根据您指出的 manul):
XSync 函数刷新输出缓冲区,然后等待,直到所有请求都已被 X 服务器接收并处理。
XSync 以这种方式调用:XSync(dpy, True)
执行上述两件事加上另外一项:丢弃(处理)队列中的所有事件。
如果您传递 True,XSync() 将丢弃队列中的所有事件,包括调用 XSync() 之前队列中的那些事件。
例如(伪代码):
sendEvent2Xserver() //for example by pressing the key
endEvent2Xserver() //for example by mouse button press
XSendEvent() //sending chosen event to X server
XSync(dpy, True) // after this call, it's guaranteed that all the previous events were processed by the server