根据man page,调用XSync(dpy, 1)
会丢弃队列中的事件,但这究竟意味着什么?如果它们没有被丢弃,它们是否被发送两次(一次是XSync()
呼叫,第二次是正常清空队列)?或者它就像一个垃圾收集器(事件会在以后被丢弃)?
答案 0 :(得分: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。
答案 1 :(得分:0)
似乎你误解了两件事:X事件的X请求,它不一样。简而言之:
X requets:
...客户端应用程序通过此连接向X服务器发送请求。这些请求由客户端应用程序中调用的Xlib函数生成。 ...
X事件:
...许多Xlib函数导致X服务器生成事件,用户键入或移动指针可以异步生成事件。 X服务器将事件返回给客户端......
有关详情,请查看this - 这非常有用。
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