2012-06-01 18 views
6

जीटीके के अन्य बिट्स की मेरी समझ का परीक्षण करने के लिए, मैं एक ऐसा प्रोग्राम लिखना चाहता हूं जिसमें मुख्य लूप का उपभोग करने के लिए हमेशा एक ईवेंट तैयार हो। मैंने यह छोटा कार्यक्रम यह करने के लिए लिखा: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(); 
} 

जब मैं इस प्रोग्राम को चलाता हूं और चेक बॉक्स पर क्लिक करता हूं, तो यह segfaults। क्या देता है? मुख्य लूप व्यस्त रखने का सही तरीका क्या है?

(साइड नोट: यह मज़बूती से 2048 गुना segfaulting से पहले टॉगल - एक संदेह से दौर संख्या।)

+0

एक डिबगर के माध्यम से भागो यह और एक पश्व-अनुरेखन प्राप्त करने की कोशिश की संभावना का संकेत भेजा हो तुल्यकालिक रूप से, और आपको एक स्टैक ओवरफ़्लो मिलेगा। – nos

+0

@nos एक स्टैक ओवरफ़्लो मैं समझ सकता था (क्योंकि, जैसा कि आप कहते हैं, सिग्नल सिंक्रनाइज़ेशन भेजते हैं), लेकिन यह वह व्यवहार नहीं है जिसे मैं देखता हूं। –

+0

@ नोस क्षमाप्रार्थी; कुछ गुगलिंग के बाद, ऐसा लगता है कि ढेर बहने से वास्तव में एक सीगफॉल्ट हो सकता है। धन्यवाद! –

उत्तर

7

अपने toggle हैंडलर के भीतर, आप checked है, जो एक toggle संकेत उत्सर्जित होना है, जो फिर से स्थापित कर रहे हैं का कारण बनता है हैंडलर ...

#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 फ्रेम एक segfault को बढ़ावा मिलेगा invokes। जिस तरह से मुख्य लूप भरा एक g_idle_add() कॉल के साथ होगा रखने के लिए मुझे लगता है कि:

अपने अन्य प्रश्न का उत्तर देने

#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(); 
} 
संबंधित मुद्दे