mikrocontroller.net

Forum: PC-Programmierung GTK+ progress_bar_update funktioniert nicht


Autor: KidMoritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

while(feof(w_datei)==0){

    fgets(buffer_array, sizeof(buffer_array),w_datei);
    
    if(strstr(buffer_array, kette) != 0){
        pvalue = zeile / zeilen_max;
        gtk_progress_bar_update(GTK_PROGRESS_BAR(progressbar1), pvalue);
        printf ("Prozent %f\n", pvalue);
        gtk_text_insert((text),  NULL, NULL,NULL, buffer_array, strlen(buffer_array));
        zeile=zeile + 1.0;
    }
}


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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pvalue ist bestimmt kein float oder double, richtig?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ansonsten versuch mal gdk_flush

Autor: KidMoritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mar Vol (marvol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal in der Schleife ein Aktualisierung der Events:

while (gtk_events_pending ())
  gtk_main_iteration ();

Gruß
Marvol

Autor: KidMoritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Versuch mal in der Schleife ein Aktualisierung der Events:
  while (gtk_events_pending ())
  gtk_main_iteration ();

Funktioniert auf Anhieb.

Worauf ist das zu begruenden?


Vielen Dank Marvol.

Autor: Jean G. (chivas)
Datum:

Bewertung
0 lesenswert
nicht 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/GtkProgr...), 
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.

Autor: KidMoritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jean G.:

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

Danke. :o)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.