GTK Memory probleme (Memory leak?)

Schnelle objektorientierte, kompilierende Programmiersprache.
BNR3108
Beiträge: 11
Registriert: Mo Jun 16, 2014 8:15 pm

GTK Memory probleme (Memory leak?)

Beitrag von BNR3108 » Mo Jun 16, 2014 8:53 pm

Hallo an alle im Forum,

Das ist mein erster Post hier :)

Ich habe folgendes Problem bei dem ihr mir hoffentlich helfen könnt.
Mein Problem ist folgendes:

Ich habe mir für meinen 3D Drucker, mit GTK in C ein Programm geschrieben welches die Maschinencodes an den Drucker schickt. Das Programm ist recht einfach aufgebaut. Eine Textdatei wird zeilenweise mittels Filestream und fgets() an die Serielle übertragen und in einem GTK_Entry ausgegeben. Zusätzlich wird noch eine Progressbar gefüllt um die Position in der Datei anzuzeigen. Damit die GUI während des Sendens benutzbar bleibt geschieht das ganze in einem mit Pthreads erzeugten Thread. Das funktioniert auch alles soweit wunderbar, nur habe ich nun bemerkt das sobald der Thread läuft und das GTK_Entry mittels gtk_entry_set_text() und die Progressbar mit gtk_progress_set_value() aktualisiert wird, der Speicherbedarf des Programms immer weiter ansteigt. :cry: Überprüft habe ich das mit dem Windows Taskmanager. Das geht so weit bis das Programm weit über 100MB einnimmt.
Wenn ich gtk_entry_set_text() und gtk_progress_set_value() auskommentiere ist das "starke" Speicherwachstum weg.

Man kann das Problem auch reproduzieren indem man ein gtk_entry_set_text() oder gtk_progress_set_value() in eine Buttoncallback-Funktion kopiert und dann paar mal auf den Button drückt. Man kann dann sehr schön sehen wie das Programm "wächst" :shock: (ganz langsam natürlich).

zusätzlich ist mir jetzt auch noch aufgefallen, das selbst wenn man garnichts macht, also nur in der gtk_main() auf irgendein Ereignis wartet, der Speicher der für das Programm benutzt wird immer weiter anwächst.
Wie kann das sein?

Kann mir jemand erklären was da los ist? Kennt jemand diese Probleme? Und was kann man dagegen tun?

Wäre wirklich klasse wenn mir jemand helfen kann!

vielen dank schonmal im voraus ;)

Lg BNR

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: GTK Memory probleme (Memory leak?)

Beitrag von cloidnerux » Di Jun 17, 2014 6:26 am

Hi und Willkommen im Forum :D
Das geht so weit bis das Programm weit über 100MB einnimmt.
Wenn ich gtk_entry_set_text() und gtk_progress_set_value() auskommentiere ist das "starke" Speicherwachstum weg.
Jop, das hört sich nach einem Speicherleck an. Sowas passiert, wenn dynamisch Speicher angefordert wird, ohne ihn wieder frei zu geben.
Aber ohne deinen Code, kann man nicht sagen was du im speziellen Falsch machst.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: GTK Memory probleme (Memory leak?)

Beitrag von oenone » Di Jun 17, 2014 10:12 am

Genau, poste mal ein Minimalbeispiel, am Besten das von dir beschriebene mit dem Button.
Außerdem bitte die GTK+ Version.

BNR3108
Beiträge: 11
Registriert: Mo Jun 16, 2014 8:15 pm

Re: GTK Memory probleme (Memory leak?)

Beitrag von BNR3108 » Di Jun 17, 2014 12:19 pm

Hallo,

Sobald ich heute zuhause bin, bereite ich mal ein kleines Codebeispiel vor was dann
hoffe ich den gleichen effekt auslöst.

danke schonmal für eure Antworten

lg BNR

BNR3108
Beiträge: 11
Registriert: Mo Jun 16, 2014 8:15 pm

Re: GTK Memory probleme (Memory leak?)

Beitrag von BNR3108 » Di Jun 17, 2014 6:24 pm

Hallo,

So ich hab nun mal schnell ein kleines Testprogramm zusammengebastelt.
Ist nicht besonders schön aber der Effekt ist da!

Hab das Programm mal in den Anhang gepackt. Einfach das Programm starten, auf "start" klicken und
das memory Wachstum im Windows-Taskmanager beobachten. (GTK Runtime muss installiert sein)

Ich verwende übrigens Gtk+ 2.24.10

Bei meinem 3d-Drucker Programm habe ich übrigens bemerkt das ab 100MB der Speicherverbrauch nicht mehr weiter ansteigt. Mal fällt er wieder zurück und mal wird es etwas mehr aber im Schnitt bleibt es bei 100MB.
Bedeutet das nun das doch alles ok ist?


Hier nochmal der Quellcode des Testprogramms:

Code: Alles auswählen

#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <pthread.h>
#include <glib.h>
#include <windows.h>


pthread_t TimerThread;
int TimerThreadRun;

struct WidgetStruct
{
GtkWidget   *MainWindow,
            *WindowVbox,
            *StartButton,
            *Textbox,
            *Progressbar;

};

static void *ThreadFunction(struct WidgetStruct *Widgets)
{
    unsigned char Counter = 0;
    unsigned int ProgressValue = 0;
    char Buffer[20] = "";

    while(TimerThreadRun)
    {
        sprintf(Buffer,"%d",Counter);
        gdk_threads_enter();

        gtk_entry_set_text(Widgets->Textbox, Buffer);
        gtk_progress_bar_set_text(Widgets->Progressbar, Buffer);
        gtk_progress_set_value(GTK_PROGRESS(Widgets->Progressbar), ProgressValue);

        gdk_threads_leave();
        Counter++;

        if(Counter==0) //bei überlauf von Counter, ProgressValue++
            ProgressValue++;
            if(ProgressValue>100)
                ProgressValue=0;

        printf("%d\n",Counter);
        Sleep(50);
    }

   return NULL;
}

void cbStartButton(GtkWidget *Button, struct WidgetStruct *Widgets)
{
    if(!TimerThreadRun)
    {
      if(pthread_create( &TimerThread, NULL, &ThreadFunction, Widgets ) != 0)
        {
        printf("Konnte Thread nicht erzeugen\n");
        return EXIT_FAILURE;
        }
        else
        {
        TimerThreadRun = 1;
        printf("SendThread Erzeugt!\n");
        }
    }
    else
    {
        TimerThreadRun = 0;
    }
}

///////////////////////////////////////////////////////

int main(int argc, char** argv)
{


    struct WidgetStruct MainWidgets;

    g_thread_init (NULL);
    gdk_threads_init ();
    gdk_threads_enter ();

    gtk_init(&argc, &argv);

    ////////MainWindow//////////
    MainWidgets.MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    MainWidgets.WindowVbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(MainWidgets.MainWindow), MainWidgets.WindowVbox);

    MainWidgets.Textbox = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(MainWidgets.WindowVbox), MainWidgets.Textbox,FALSE,FALSE,0);

    MainWidgets.Progressbar = gtk_progress_bar_new();
    gtk_box_pack_start(GTK_BOX(MainWidgets.WindowVbox), MainWidgets.Progressbar,FALSE,FALSE,0);

    MainWidgets.StartButton = gtk_button_new_with_label("Start");
    gtk_box_pack_end(GTK_BOX(MainWidgets.WindowVbox), MainWidgets.StartButton,FALSE,FALSE,0);

    gtk_widget_show_all(MainWidgets.MainWindow);

    ///////Signals Connecting/////////////////
    g_signal_connect(MainWidgets.MainWindow, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    g_signal_connect(MainWidgets.StartButton, "clicked", G_CALLBACK(cbStartButton), &MainWidgets);

    gtk_main();
    gdk_threads_leave ();

    return 0;
}
Lg BNR

Edit by cloidnerux: Code-Tags
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

BNR3108
Beiträge: 11
Registriert: Mo Jun 16, 2014 8:15 pm

Re: GTK Memory probleme (Memory leak?)

Beitrag von BNR3108 » Di Jun 17, 2014 7:34 pm

Ich nochmal,

Das mit den 100MB muss ich zurücknehmen :cry:
Das Programm benötigt doch immer mehr und mehr Speicher...


LG BNR

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: GTK Memory probleme (Memory leak?)

Beitrag von oenone » Mi Jun 18, 2014 8:50 am

Also unter Linux existiert definitiv kein Memory Leak. Der Speicherverbrauch ist ab Klick auf den Button konstant. Source Code fast identisch zu deinem (Sleep durch nanosleep ausgetauscht, windows.h entfernt, veraltetes g_thread_init entfernt, Typ vom Parameter zu ThreadFunction zu void* geändert, ein paar Casts hinzugefügt um Warnings zu entfernen).

Edit: Einige Memory-Leaks in GTK für Windows sollen in Version 2.24.14 gefixt sein. Update mal deine Installation.
https://bugzilla.gnome.org/show_bug.cgi?id=685959
Ist also ein bekanntes Problem. Meine Empfehlung: GTK nur für Linux verwenden, da Windows von den Devs wenig Zuwendung bekommt. Für Cross-Platform ist meiner Meinung nach Qt die bessere Wahl.

BNR3108
Beiträge: 11
Registriert: Mo Jun 16, 2014 8:15 pm

Re: GTK Memory probleme (Memory leak?)

Beitrag von BNR3108 » So Jun 22, 2014 10:21 am

Vielen dank für die Antwort,

Werde jetzt wohl oder übel auf Qt umsteigen müssen. :cry:

Mfg

BNR

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: GTK Memory probleme (Memory leak?)

Beitrag von Xin » Mi Jun 25, 2014 10:57 am

BNR3108 hat geschrieben:Das mit den 100MB muss ich zurücknehmen :cry:
Das Programm benötigt doch immer mehr und mehr Speicher...
In welchem Rahmen bewegt sich das denn?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

BNR3108
Beiträge: 11
Registriert: Mo Jun 16, 2014 8:15 pm

Re: GTK Memory probleme (Memory leak?)

Beitrag von BNR3108 » Mi Jun 25, 2014 5:54 pm

also es sind so ca. 80 MB pro Stunde.
Ich habs mal eine ganze weile auf Arbeit laufen lassen und die 700 MB geknackt.
Wenn es ein Programm wäre was man nur mal kurz laufen lässt wäre es nicht so wild,
aber der 3D Drucker lauft schon mal 4-5 Stunden am Stück...

Grüße BNR

Antworten