Entwickler-Ecke

WinForms - Progressbar auf die Arbeitzeit füllen


Vegeto - Fr 08.03.13 10:20
Titel: Progressbar auf die Arbeitzeit füllen
Hallo.

Ich bin gerade dabei eine progressbar in meine Anwendung einzubauen.Doch ich komme einfach nicht weiter.

Im Internet finde ich diverse Tutorials, doch hier werden die Progressbars mit Zeit aufgefüllt, sprich in 10 sek soll die Progressbar voll sein (oder einstellbar).

Doch ich möchte das er mir genau auf die Arbeit die er macht, die Prograssbar auffüllt.

Ich habe etliche tutorials gefunden die zeigen, wie es mit schleifen geht.

Ich habe aber nichts gefunden, das mir mein problem in einer hinsicht ähnelt.

Ich hoffe einer von euch weiß wo von ich spreche :)

Lg


jfheins - Fr 08.03.13 11:15

Tja dann musst du deine Arbeit in kleine Häppchen aufteilen und nach jedem Häppchen die Fortschrittsleiste aktualisieren.

Wie du das anstellen sollst, können wir dir nur sagen, wenn du uns deine Arbeit zeigt oder beschreibst :P


Vegeto - Fr 08.03.13 11:46

Also ich möchte die Thematik in alles meinen Anwendung verwenden und nicht alle Anwendungen machen das selbe xD

Nunja momentan bin ich an so einem kleinen Editor drann, meine WinApp besteht aus einem Textbox(multiLine) und einem Button, sobald man auf dem Button klickt, wird der inhalt der Textbox in eine TextDatei beschrieben und um den Fortschritt zusehen, wie lange das speichern dauert soll mir die progressbar anzeigen.

lg


jfheins - Fr 08.03.13 12:45

Tja, ich würde sagen überflüssig :lol:
laut Windows-Styleguide soll eine progressbar angezeigt werden, sobald etwas länger als 2 Sekunden dauert. Keine Ahnung was du so speicherst, aber "Text in Datei" dürfte eigentlich nie so lange dauern.

Wenn du natürlich unbedingt eine progressbar zeigen möchtest, würde ich vorschlagen
1. Text in Datei speichern, Progressbar.Max auf 20.
2. Einen Timer starten, der alle 100ms auslöst.
3. Im Timer die Progressbar weitersetzen.
:mrgreen:

Oder wenn man wirklich beim Speichern zugucken soll:
1. Progressbar.Max auf Anzahl der Zeilen, textbox auf readonly, Index auf 0
2. Einen Timer starten, der alle 100ms auslöst.
3. Im Timer die Progressbar weitersetzen und Zeile Nr. Index speichern. Wenn alles gespeichert ist, Progressbar zurücksetzen und die Textbox wieder editierbar machen.

Du siehst, alle meine Ideen basieren darauf den Speichervorgang künstlich in die Länge zu ziehen :lol:


Es gibt leider keine Allgemeine Lösung, man muss sich immer das problem angucken. Zum Beispiel hatte mal so eine Lösung:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        private void DisplayProgress(int currentdigit)
        {
            status_lbl.Text = "Berechnung läuft...";

            double progress = (double)currentdigit / _digits;
            progress = 2 * progress - progress * progress; // Quadratisches Laufzeitverhalten kompensieren
            
            var remainingTime = (1 / progress - 1) * sw.ElapsedMilliseconds / 1000d;

            progress_lbl.Text = string.Format("Geschätze Restzeit: {0:0} Sekunden", remainingTime);
            progressBar1.Value = progress;
        }

Da die Berechnung den Fortschritt nicht linear gemacht hat, habe ich durch das quadrieren erreicht dass die Fortschrittsleiste einigermaßen linear lief und die Restzeit ebenfalls sehr genau geschätzt wurde.


Vegeto - Fr 08.03.13 12:56

Hi jfheins,

Danke für deine Antwort, ich werde versuchen Sie umzusetzen :)

Also das mit Text in Datei speichern, war nur ein Beispiel, es gibt auch längere Arbeiten wie zum Beispiel Daten aus Excel in eine Datenbank speicher etc und bei diesen Arbeiten dauert es nunmal lange und ich möchte das der Nutzer zieht, das die Anwenung arbeitet und nicht hängen geblieben ist.

Danke ich versuche mich mal ran, bei irgendwelchen problemen melde ich mich.

Lg


DavidD - Fr 08.03.13 14:14

Für sowas kann man auch alternativ einen Splash Screen verwenden.
http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C

Wahlweise kannst du auch einfach auf irgendein Gif wie die Windows Sanduhr zurückgreifen und anzeigen wenn sich die Art der Arbeit nicht wirklich einteilen lässt.


Ralf Jansen - Fr 08.03.13 14:18

Die gute alte Zeit wo dem User eine Sanduhr (kreisende Punkte etc.) reichte wenn man nichts genaueres wußte sind wohl vorbei ;) Es braucht nun gefaktes Feedback das Kontrolle vortäuscht aber natürlich auch nicht mehr Aussagekraft hat.