題は違うのだが、gdk_flushの説明が出てくる。同期がとられますな。fileのflushと同じだ。
5.3. GTK+ を使って、別スレッドでちょっとしたことをしている。 gdk_threads_enter/gdk_threads_leave() を使ってちゃんとロックしているのに、表示が正しく更新されない。 [GTK 2.x]
GTK+ を使って、別スレッドでちょっとしたことをしている。 gdk_threads_enter/gdk_threads_leave() を使ってちゃんとロックしているのに、表示が正しく更新されない。 [GTK 2.x]
効率を上げるため、X ウィンドウシステムでは、一つ一つコマンドをすぐに送るのではなく、コマンドをいくつか一まとめにして、X サーバーにバッチで送っています。
マルチスレッド化されていないプログラムでは、この点に関する心配は無用です。というのは、メインループに制御が戻った時には、まず最初に、残っている X リクエストが X サーバーに送出されるからです。
しかし、メインループ以外でスレッドから GTK+ を呼び出している場合は、バッチ化されたコマンドをいつ送出するのかは、GTK+ にはわかりません。そのため、通常は、gdk_thread_leave() を呼び出す前に、 gdk_flush() を呼んでおく方がいいです。
実際は、gdk_flush() だと、ここで必要とする以上に高くつきます。というのは、この関数も同様に、 X サーバーで残りのコマンドが終了するのを待つからです。ですから、性能が気になる場合は、直接 XFlush() を呼び出した方がいいかも知れません。
訳が悲惨。「不正な領域」ってinvalidateされたってことね。つまりあらたに描画しなおしが必要な領域ってこと。
GdkWindow は "不正な領域" を保守します; つまり X (または他のウィンドウシステム) からエキスポーズ・イベント (訳注: 画面の再描画イベント) を受け取ると、ウィジットに直接シグナルを発行せずに不正な領域に追加されます。ハンドラがアイドル中の場合は GTK+ が gdk_window_process_updates() を呼び出します。この関数は不正な領域を矩形の組に変換して、エキスポーズ・イベントとしてこの組をウィジットに送信します。ウィンドウの位置を再描画するために、アプリケーションは gdk_window_invalidate_rect() を呼び出す必要があります; つまり、これは指定されたウィンドウの範囲を不正な領域に追加することを意味します。アプリケーション自身がエキスポーズしたり、他の描画を最適化することが劇的に簡単になりました; つまりそれは expose_event ハンドラを書くだけで、GTK+ がその機能を担当してくれます。
0 件のコメント:
コメントを投稿