GTK+ progress_bar_update funktioniert nicht

Gast #1685815
Lesenswert?

Hallo Spezialisten,

System:  Windows (mit GTK+ ext.)
Sprache: C
Ich verwende das GTK+ fuer die Fensterprogrammierung

Ich habe ein Programm geschrieben, welches den Inhalt einer Datei 
zeilenweise kopiert.
Zeilen mit bestimmten Inhalt werden im Testfenster (GTK) ausgegeben.
Das funkioniert sehr gut.

Der Status des kopieren soll mit einer "progress_bar" 
(Fortschrittsbalken) sichbar gemacht werden.

Das GTK Widget habe ich erstellt.
Es wird angezeigt.
Es arbeitet aber nicht so wie ich das gerne haette.

Der Kopiervorgang startet -> progressbar 0%  (entspricht 0.0)
                  endet   -> progressbar 100%(entspricht 1.0)

Aber die Zwichenschritte werden nicht angezeigt.

Hier ein Auszug aus meinem Code:
1
while(feof(w_datei)==0){
2

3
    fgets(buffer_array, sizeof(buffer_array),w_datei);
4
    
5
    if(strstr(buffer_array, kette) != 0){
6
        pvalue = zeile / zeilen_max;
7
        gtk_progress_bar_update(GTK_PROGRESS_BAR(progressbar1), pvalue);
8
        printf ("Prozent %f\n", pvalue);
9
        gtk_text_insert((text),  NULL, NULL,NULL, buffer_array, strlen(buffer_array));
10
        zeile=zeile + 1.0;
11
    }
12
}

Die Variable zeilen_max habe ich vorher ermittelt.
Die Variable pvalue nimmt einen Wert zwischen 0.0 (0%) bis 1.0 (100%) 
an.
Der Wert von pvalue wird stetig aktualisiert und wird an 
gtk_progress_bar_update uebergeben.
Die Progressbar zeigt aber nur 0% und nach Abschluss des Kopieren 100% 
an
Die Zwischenschritte werde nicht angezeigt.
Gebe ich der progressbar einen beliebigen festen Wert ein z.B. 0.3 dann 
werden die 30% in der progressbar angezeigt.

Kann jemand helfen.

Im Voraus vielen Dank.
Gast #1686028
Lesenswert?

>pvalue ist bestimmt kein float oder double, richtig?

gfloat pvalue;

>Wahrscheinlich blockierst Du den Zeichenthread und daher kann Deine
>Statusbar erst gerendert werden wenn Deine Funktion durchgelaufen ist.

Wie kann ich dem entgegenwirken?
Ich habe auch die Funktion zur Ausgabe ins Textfeld mal herausgenommen.
Keine Aenderung.

>gdk_flush();
Zeigt keine Wirkung.
#1686376
Lesenswert?

Hallo,

>Worauf ist das zu begruenden?

Einfach gesagt: Zur Laufzeit des Kopiervorgangs unterliegen PROGRESS_BAR 
Events nicht der Kontrolle der gtk_main(), welche sich wohl irgendwo in 
deinem Code befindet. Dies kann durch gtk_main_iteration () forciert 
werden. Ausstehende (pending) Events werden dadurch abgearbeitet (evtl. 
GTK Main Loop und nested GTK Main Loop googlen).

Workaround für 2.x:

http://library.gnome.org/devel/gtk-faq/stable/x601.html

Kleiner Hinweis noch: Zwei Zeilen deines Codeauszugs sollten so besser 
nicht mehr genutzt werden 
(gtk_progress_bar_update(http://library.gnome.org/devel/gtk/stable/GtkProgressBar.html#gtk-progress-bar-update), 
gtk_text_insert(...)). Die aktuelle Dokumentation 
(http://library.gnome.org/devel/) erspart dir da unter Umständen etwas 
an Arbeit. Sind auch gute Beispiele dabei.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren