GTK+のウィンドウでCairoを使って模擬戦場の現状を表示したい。私のアプリケーションは、独自のメイン ループで動作する提供されたフレームワークを使用する必要があります。そのため、メイン スレッドで呼び出すことができずgtk_main
、別のスレッドで GTK+ メイン ランループを起動する必要があります。
...
g_thread_init(NULL);
g_thread_create(gui_main_loop, data, FALSE, NULL);
...
...
gpointer gui_main_loop(gpointer data)
{
...
gdk_threads_init();
gdk_threads_enter();
...
// Here I make my cute UI
...
gtk_main();
gdk_threads_leave();
...
}
...
描画領域の「描画」イベントにハンドラーを追加しました。
...
gboolean rendering(GtkWidget *widget, cairo_t *c, gpointer data)
{
// Here I render my UI using cairo.
return TRUE;
}
...
// I call this function before gtk_main
g_signal_connect(G_OBJECT(drawing_area), "draw", G_CALLBACK(rendering), data);
...
そのため、私の GTK+ ウィンドウは別のスレッドに存在し、ウィンドウのサイズを変更するたびに再描画されます。しかし、戦場の現在の状況を監視するために、1秒間に数回更新する必要があります. すべての反復で、メイン スレッドから無効化関数を呼び出します。
...
gdk_window_invalidate_rect(gtk_widget_get_window(drawing_area), NULL, true);
...
しかし、数秒で UI がフリーズします。ウィンドウのサイズ変更に反応しますが、gdk_window_invalidate_rect 呼び出しは無視します。私は何を間違っていますか?