Forum: PC-Programmierung GTK+ progress_bar_update funktioniert nicht


von KidMoritz (Gast)


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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von ich (Gast)


Lesenswert?

pvalue ist bestimmt kein float oder double, richtig?

von ich (Gast)


Lesenswert?

und ansonsten versuch mal gdk_flush

von KidMoritz (Gast)


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.

von Mar V. (marvol)


Lesenswert?

Versuch mal in der Schleife ein Aktualisierung der Events:

while (gtk_events_pending ())
  gtk_main_iteration ();

Gruß
Marvol

von KidMoritz (Gast)


Lesenswert?

>Versuch mal in der Schleife ein Aktualisierung der Events:
1
  while (gtk_events_pending ())
2
  gtk_main_iteration ();

Funktioniert auf Anhieb.

Worauf ist das zu begruenden?


Vielen Dank Marvol.

von Jean G. (chivas)


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.

von KidMoritz (Gast)


Lesenswert?

@ Jean G.:

Vielen Dank für deine Erläuterung und Hinweise zum Workaround.
Ich werde dies gleich mal aktualisieren.

Danke. :o)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.