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.


Log in to reply