GTK: wann werden Elemente zerstört ?
-
Ich habe ein normales GTK-Programm unter Linux, u.a. mit einem gtk_clist-Element.
Bei Programmende möchte ich noch Daten daraus auslesen und in eine Datei speichern.
Das klappt aber nicht, vermutlich weil bereits dieses Element zerstört ist.
Wann genau zerstört GTK seine Elemente ?GtkWidget *projbox;
projbox=gtk_clist_new(anz);
...
gtk_widget_show_all(window);
...
gtk_main ();startwerte(TRUE); //<<hier werden die Werte ausgelesen, es kommt aber nichts Sinnvolles mehr heraus
return 0;
Alles, was vor dem gtk_main aus dieser projbox ausgelesen wird, ist korrekt.
Aber danach nicht mehr. da zwischendurch nichts mehr mit der projbox passiert, müsste also gtk_main() hier bereits am zerstören sein.Oder hat jemand eine andere Idee ?
-
malabarista schrieb:
Wann genau zerstört GTK seine Elemente ?
[...]Alles, was vor dem gtk_main aus dieser projbox ausgelesen wird, ist korrekt.
Aber danach nicht mehr. da zwischendurch nichts mehr mit der projbox passiert, müsste also gtk_main() hier bereits am zerstören sein.Oder hat jemand eine andere Idee ?
Eine Applikation kann ja auf mehrere Arten beendet werden
1. Durch Klick auf X
2. Durch Klick auf irgend einen Button, für den Du in Deiner Applikation eine Callbackfunktion hast.Bei Klick auf X hast Du wahrscheinlich in Glade (?) unter destroy die "gtk_main_quit" angegeben. Damit wird dann noch der Code nach der gtk_main ausgeführt. Ich vermute (!) - ich weiss es also nicht genau - dass GTK hier bereits finalized ist. Wenn Du bei Klick auf X statt destroy das Signal "delete-event" nimmst - also etwa "on_window1_delete_event", kannst Du Deine applikatorischen Anforderungen noch ausführen und dann selbst die gtk_main_quit aufrufen - also genauso, wie Du es bei einem Button oder Menueintrag machst, der Dein Programm beenden soll.
-
Das hat mit dem Memory Management von GTK+ zu tun. Sobald ein GtkWindow geschlossen wurde (egal wie, ausser hide), zerstört dieses seine Kinder und die machen das gleiche mit den ihren usw.
Die einfache Lösung wäre folgende:
projbox=gtk_clist_new(anz); g_object_ref(projbox); // GtkWindow ist nicht der einzige Nutzer von projbox ... startwerte(TRUE); // projbox ist als einziges Widget noch nicht gelöscht worden g_object_unref(projbox); // und das holen wir hier nach
Btw@SaHel: Ich mag Glade nicht.
-
Ja, das ist richtig: der Effekt tritt nur ein, wenn man das Fenster durch Anklicken von X schliesst.