ProgressBar mit Prozente anzeigen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von IP4D.

    ProgressBar mit Prozente anzeigen

    Hallo zusammen,

    ich habe eine ProgressBar und möchte die Prozente dazu in einem Label anzeigen lassen. Hier ein Beispiel Code

    VB.NET-Quellcode

    1. Public Sub Pause(ByVal Millisekunden As Long)
    2. sleep(Millisekunden)
    3. End Sub

    VB.NET-Quellcode

    1. ...
    2. For i = 1 To 30
    3. Pause(100)
    4. ProgressBar1.Value = i
    5. Label3.Text = ProgressBar1.Value.ToString & " %"
    6. Next i
    7. ...

    Aber der Text von Label3 wird erst aktualisiert wenn die Schleife durchlaufen ist. Kann mir einer sagen woran das liegt? Die ProgressBar wird ja bei jedem Durchlauf aktualisiert.

    Danke
    Hi.

    Dein Problem liegt darin, dass die Schleife im Mainthread ausgeführt wird, welcher auch für die Form zuständig ist. Per Sleep() lässt du den Mainthread warten, sodass er auch die Form (und das Label) nicht aktualisiert. Die Lösung ist ein BackgroundWorker, der asynchron ausgeführt wird und so die Schleife von der Form "trennt". Ein Beispiel findest du im MSDN (zum Download?). Suche nach "BackgroundWorker".
    Gruß
    hal2000
    Hey M-Arens,

    wieso benutzt du denn eine For-each-Schleife, um den Wert der Progressbar in einem Label anzeigen zu lassen?
    Mach das doch einfach mit einem Timer. Geht viel leichter.
    Was du dazu brauchst:

    1x Progressbar
    2x Timer
    1x Label

    Hier der Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Timer1.Start()
    4. Timer2.Start()
    5. End Sub
    6. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    7. Timer2.Interval = 1 'jede tausendstel Sekunde wird abgefragt welchen Wert die Progressbar hat...
    8. Label1.Text = ProgressBar1.Value & "%"
    9. End Sub
    10. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    11. Timer1.Interval = 250 'beliebige Zahl. Die legt fest wie schnell die Progressbar läuft...
    12. ProgressBar1.Increment(1)
    13. End Sub
    14. End Class


    Fertig. Funzt super, denn jede tausendstel Sekunde (1/1000 sek) wird abgefragt welchen Wert die Progressbar hat.

    Hoffe ich konnte helfen. ^^

    lg
    Ip4D =]
    Ich will jetzt nicht beleidigend werden, aber der Beitrag von IP4D ist nicht akzeptabel.
    ein Timer? Wieso sollte man freiwillig, sein Programm zerstören.

    Timer sind in der Regel nur eine Notlösung, falls es mit Schleifen nicht mehr realisierbar ist.
    Dein Problem kannst du lösen in dem du ein Delegate verwendest. Dieses lässt sich beispielsweise in einen Backgroundworker einbauen.
    Der Vorteil dabei ist, dass es unabhängig voneinander agiert. Dadurch kannst du während eines Vorgangs, verschiedene Elemente ansteuern.

    mfg
    @Devil: Ich stimme dir zu. Die Timer-Lösung ist nicht akzeptabel und führt zu unsauberem Code.

    Timer-Benutzer wundern sich oft, warum ihr Code einmal funktioniert und einmal nicht - das liegt daran, dass Racebedingungen eben nicht nur bei Multithreading, sondern auch bei mehreren Timern auftreten können. Das Programm arbeitet dann in einem inkonsistenten Zustand, der nicht vorhersagbare Ergebnisse produziert.
    Gruß
    hal2000
    xD okay...
    Sorry, dass ihr das so sieht xD. Ich benutze eigentlich immer den Timer für so was.
    Und wenn man den benutzt, zerstört man das Programm.? :huh: Bei mir sind in den 2 Jahren noch keine Fehler aufgetreten.
    Nur manchmal mit diesem Code:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. ProgressBar1.Value = +1
    3. End Sub

    deswegen benutzt ich immer:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. ProgressBar1.Increment(1) 'Irgendeine Zahl
    3. End Sub


    Aber bei den Codes meines letzten Beitrags sind, wie gesagt, noch keine Fehler aufgetreten. Das mit den Schleifen brauche ich nicht.^^ Ich lass weiterhin den Wert einer Progressbar mit einem Timer abfragen :P

    Ip4D
    das meinte ich doch. ich verwechsel immer = und + xD
    hast recht der Code:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. ProgressBar1.Value = +1
    3. End Sub

    funktioniert nicht, sondern nur der Code:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. ProgressBar1.Value += 1
    3. End Sub


    dennoch treten manchmal Fehler, bei diesem Code, auf. Man muss den Timer noch stoppen. bei der Increment-Funktion brauchste das nit^^