X11 XSync-discard参数意味着什么?

X11 XSync-discard参数意味着什么?,x11,X11,根据,调用XSync(dpy,1)会丢弃队列中的事件,但这到底意味着什么?如果没有丢弃它们,是否发送两次(一次是通过XSync()调用发送,第二次是在队列正常清空时发送)?或者它就像一个垃圾收集器(事件会在稍后被丢弃)?您似乎误解了两件事:X请求和X事件,这是不一样的。简言之: 十项要求: 。。。客户端应用程序通过此连接向X服务器发送请求。这些请求由客户端应用程序中调用的Xlib函数发出 十项活动: 。。。许多Xlib函数导致X服务器生成事件,用户键入或移动指针可以异步生成事件。X服务器将事件返

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

您似乎误解了两件事:X请求和X事件,这是不一样的。简言之:

十项要求:

。。。客户端应用程序通过此连接向X服务器发送请求。这些请求由客户端应用程序中调用的Xlib函数发出

十项活动:

。。。许多Xlib函数导致X服务器生成事件,用户键入或移动指针可以异步生成事件。X服务器将事件返回到客户端

有关更多信息,请查看-这非常有用

XSync这样调用:
XSync(dpy,False)
做两件事(根据您指出的manul):

XSync函数刷新输出缓冲区,然后等待,直到X服务器接收并处理完所有请求

XSync是这样调用的:
XSync(dpy,True)
完成上述两件事,外加一件事:丢弃(处理)队列中的所有事件

如果传递True,则XSync()将丢弃队列中的所有事件,包括调用XSync()之前队列中的事件

例如(伪代码):

等待请求输出缓冲区清空(发送到服务器)。如果
discard
参数为
True
,则此函数将丢弃所有排队事件。这些事件是从X服务器接收的

考虑以下协议交换:

C -> S  QueryKeymap request
                                C <- S ConfigureNotify event
                                C <- S QueryKeymap reply
C->S QueryKeymap请求

C“丢弃”的确切含义是什么?我把它读作“扔掉”。例如,X服务器发送一个ButtonRelease事件,但是如果客户端在处理完整队列之前执行
XSync(dpy,True)
,事件会丢失吗?OTOH,您编写它处理事件,因此可能意味着它在返回之前处理来自X服务器的所有回复(如BadWindow错误等)?没有任何内容丢失,因为我编写的事件由服务器处理。XSync(dpy,1)同步X客户机和X服务器之间的执行。在进行XSync(dpy,1)调用后,您可以保证所有以前的请求和事件都由X服务器处理(就像OpenGL中的glFinish()一样)。
C -> S  QueryKeymap request
                                C <- S ConfigureNotify event
                                C <- S QueryKeymap reply