Para probar mi comprensión de otros bits de Gtk, me gustaría escribir un programa que siempre tenga un evento listo para que el bucle principal consuma. Escribí este programa corto para intentar hacer esto:segfault al tratar de mantener el bucle principal ocupado
#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();
}
Cuando ejecuto este programa y hago clic en la casilla de verificación, segfaults. ¿Lo que da? ¿Cuál es la forma correcta de mantener ocupado el bucle principal?
(Nota al margen: se conmuta de forma fiable 2048 veces antes de violación de segmento - un número redondo con recelo.)
ejecutarlo a través de un depurador y tratar de conseguir una traza, probablemente las señales se enviaron sincrónicamente, y obtendrá un desbordamiento de pila. – nos
@nos Un desbordamiento de pila que pude entender (porque, como dices, las señales parecen despacharse sincrónicamente), pero ese no es el comportamiento que veo. –
@nos Disculpas; después de un poco de Google, parece desbordar la pila puede causar una segfault. ¡Gracias! –