6
Gtkの他のビットについての私の理解をテストするために、メインループが常に消費するイベントがあるプログラムを作成したいと思います。メインループのビジー状態を維持しようとするとsegfaultが発生する
#include <gtk/gtk.h>
static void toggle(GtkWidget *check, gpointer data)
{
gboolean checked;
g_object_get(check, "active", &checked, NULL);
g_object_set(check, "active", !checked, NULL);
}
int main(int argc, char *argv[])
{
GtkWidget *window, *check;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
check = gtk_check_button_new();
g_signal_connect(check, "toggled", G_CALLBACK(toggle), NULL);
gtk_container_add(GTK_CONTAINER(window), check);
gtk_widget_show_all(window);
gtk_main();
}
このプログラムを実行してチェックボックスをクリックすると、この問題が発生します。何がありますか?メインループをビジー状態に保つ正しい方法は何ですか?
(サイドノート:それは確実にセグメンテーションフォルトの前に2048回を切り替えます - 怪しラウンド数を。)あなたのtoggle
ハンドラ内
そうな信号が派遣取得、デバッガを通してそれを実行し、バックトレースを取得しよう:私は完全なメインループを維持する方法は、
g_idle_add()
呼び出しであることだと思う:あなたの他の質問に答えるために同期的にスタックオーバーフローが発生します。 – nos
@nosスタックオーバーフロー(私が理解できるように、シグナルは同期的にディスパッチされているように見えるので)、それは私が見る動作ではありません。 –
@nos申し訳ありません。グーグルのビットの後に、それは実際にスタックをオーバーフローさせるように見えるかもしれません。ありがとう! –