3

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 呼び出しは無視します。私は何を間違っていますか?

4

1 に答える 1