5

根据手册页,调用XSync(dpy, 1)会丢弃队列中的事件,但这究竟意味着什么?如果它们没有被丢弃,它们是否被发送了两次(一次通过XSync()调用,第二次在队列正常清空时)?或者它就像一个垃圾收集器(事件会在稍后被丢弃)?

4

2 回答 2

1

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

于 2013-06-13T14:52:43.703 回答
0

似乎您误解了两件事: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
于 2013-01-25T15:07:59.870 回答