5

man ページによると、呼び出しXSync(dpy, 1)はキュー内のイベントを破棄しますが、これは実際にはどういう意味ですか? それらが破棄されない場合、それらは 2 回送信されますか (1 回はXSync()呼び出しによって、2 回目はキューが正常に空になったとき)? それとも、ガベージ コレクターのようなものですか (イベントはとにかく後で破棄されます)。

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)のキューに入れられたイベントの数を返します。1ConfigureNotify

XSync(display, True)代わりに を使用すると、上記の場合に戻りますXPending(display)0

あなたのコードを他の人が使用する場合は、 を使用しないことで時間を節約してくださいTrue。の使用時に問題が発生する例については、http://bugzilla.libsdl.org/show_bug.cgiTrue ?id=1859を参照してください。

于 2013-06-13T14:52:43.703 に答える
0

あなたは 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
于 2013-01-25T15:07:59.870 に答える