2012-06-01 10 views
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ハンドラ内

+0

そうな信号が派遣取得、デバッガを通してそれを実行し、バックトレースを取得しよう:私は完全なメインループを維持する方法は、g_idle_add()呼び出しであることだと思う:あなたの他の質問に答えるために

同期的にスタックオーバーフローが発生します。 – nos

+0

@nosスタックオーバーフロー(私が理解できるように、シグナルは同期的にディスパッチされているように見えるので)、それは私が見る動作ではありません。 –

+0

@nos申し訳ありません。グーグルのビットの後に、それは実際にスタックをオーバーフローさせるように見えるかもしれません。ありがとう! –

答えて

7

は、あなたが再放射されるtoggle信号を引き起こすcheckedを、設定していますハンドラ...

#11564 0xb775ba50 in g_closure_invoke() from /usr/lib/libgobject-2.0.so.0 
#11565 0xb776e5d0 in ??() from /usr/lib/libgobject-2.0.so.0 
#11566 0xb77774d6 in g_signal_emit_valist() from /usr/lib/libgobject-2.0.so.0 
#11567 0xb7777682 in g_signal_emit() from /usr/lib/libgobject-2.0.so.0 
#11568 0xb7e067ba in gtk_toggle_button_toggled() 

私はダウンすべての方法に従っていませんでしたが、私はセグメンテーション違反につながるか> 11000のフレームを参照することができますが呼び出されます。

#include <gtk/gtk.h> 

static void toggle(GtkWidget *check, gpointer data) 
{ 
    g_print("."); 
} 

GtkWidget *window, *check; 

static gboolean 
toggle_it() 
{ 
    gboolean checked; 
    g_object_get(check, "active", &checked, NULL); 
    g_object_set(check, "active", !checked, NULL); 
    return TRUE; 
} 

int main(int argc, char *argv[]) 
{ 
    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); 
    g_idle_add((GSourceFunc)toggle_it, NULL); 
    gtk_main(); 
} 
関連する問題