man ページによると、呼び出しXSync(dpy, 1)
はキュー内のイベントを破棄しますが、これは実際にはどういう意味ですか? それらが破棄されない場合、それらは 2 回送信されますか (1 回はXSync()
呼び出しによって、2 回目はキューが正常に空になったとき)? それとも、ガベージ コレクターのようなものですか (イベントはとにかく後で破棄されます)。
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
。の使用時に問題が発生する例については、http://bugzilla.libsdl.org/show_bug.cgiTrue
?id=1859を参照してください。
あなたは 2 つのことを誤解しているようです: X リクエストと X イベント、それは同じではありません。要するに:
X リクエスト:
... クライアント アプリケーションは、この接続を介して X サーバーに要求を送信します。これらの要求は、クライアント アプリケーションで呼び出される Xlib 関数によって行われます。...
X イベント:
... 多くの Xlib 関数は、X サーバーにイベントを生成させます。また、ユーザーが入力したりポインターを動かしたりすると、イベントを非同期的に生成できます。X サーバーはクライアントにイベントを返します...
詳細については、これを確認してください- とても役に立ちます。
そのように呼び出されたXSync:XSync(dpy, False)
2つのことを行います(あなたが指摘したmanulによると):
XSync 関数は、出力バッファーをフラッシュし、すべての要求が X サーバーによって受信および処理されるまで待機します。
XSync はそのように呼び出されます:XSync(dpy, True)
上記の 2 つのことと追加の 1 つを行います: キュー内のすべてのイベントを破棄 (処理) します。
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