サイズ: 2590
コメント:
|
サイズ: 3091
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 28: | 行 28: |
* 失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う | * 成功/失敗の確定を待つので遅くなる。失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う |
行 33: | 行 33: |
* 大量のリクエストを連続して行う場合(アトム値の取得など)、最初に全てのリクエストを送ってからリプライを取得する * Xlibでは設計上このようにすることができず、1つづつリクエスト->リプライ取得を行うためにXCBより遅くなりがち |
|
行 39: | 行 41: |
なぜXCBがXlibより速くなるのかはチュートリアルに書いてある: http://xcb.freedesktop.org/tutorial/ |
XCBのリクエスト処理
xcb-requests(3)を読んでまとめただけ。
Xクライアントがサーバに対して送るリクエストは2種類ある。
- リプライを要求しないもの
単純に要求のみを行うもの。例えばMapRequest
- リクエストの結果は、それが成功したか失敗したかのみ
- リプライを要求するもの
「何かを取得する」リクエストがこれにあたる。例えばInternAtom
- 成否の他に、リクエスト成功時はリプライが来る
さらに、XCBではエラーハンドリングの方法が2つ用意されている。
- checked
- リクエストを投げる関数が成功/失敗が確定するまでブロックする。エラーは即座に確認できる
- リプライを要求するリクエストに関してはこちらがデフォルト
- unchecked
- リクエストを投げる関数がブロックしない。発生したエラーはイベントループで通知される
- リプライを要求しないリクエストに関してはこちらがデフォルト
以上2*2=4通りの方法が存在する。
- リプライなし、unchecked(デフォルト)
- リクエストを投げるときは対応する関数を呼ぶだけ。リプライがないので本当にそれだけ
- エラーはイベントループで検出
- リプライなし、checked
XXX_checkedのように、関数名に_checkedというサフィックスがつく
帰ってきたcookieをxcb_request_checkに渡すとエラーの有無が分かる
- 成功/失敗の確定を待つので遅くなる。失敗した場合先に進んではいけない(エラー処理が必要な)場合に使う
- リプライあり、checked(デフォルト)
- checkedだがリプライなしの方とは違ってサフィックスはない
XXXという関数に対してXXX_replyという関数でリプライを取得する。このとき同時にエラーの有無を取得する
- 結果が必要なので普通はこれを使えばいいはず
- 大量のリクエストを連続して行う場合(アトム値の取得など)、最初に全てのリクエストを送ってからリプライを取得する
Xlibでは設計上このようにすることができず、1つづつリクエスト->リプライ取得を行うためにXCBより遅くなりがち
- リプライあり、unchecked
今度は逆に_uncheckedというサフィックスがつく
- リプライの取得方法は同じ。エラーはイベントループで検出
- 今ひとつ使いどころが分からないが、manを読む限りリクエストを投げてからリプライを受け取るまでに他の処理を行うような場合を想定している?
リクエストのバッファリングについて参考: http://lists.freedesktop.org/archives/xcb/2008-December/004152.html
なぜXCBがXlibより速くなるのかはチュートリアルに書いてある: http://xcb.freedesktop.org/tutorial/