Problem mit Neuzeichnen einer ProgressBar beim Warten auf einen Thread

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Hugo_Stiglitz.

    Problem mit Neuzeichnen einer ProgressBar beim Warten auf einen Thread

    Hi,

    habe ein Problem mit einer ProgressBar. Ich habe meine DB-Abfrage in einen Threat gepackt, damit die Form an sich ansprechbar bleibt. Das war der Plan.
    Aufruf wie folgt:

    VB.NET-Quellcode

    1. Dim ts As System.Threading.ThreadStart = New System.Threading.ThreadStart(Function() WarteAufDB(MyConfig, Skript))
    2. Dim t As System.Threading.Thread = New System.Threading.Thread(ts)
    3. t.Start()
    4. While t.IsAlive ' solange warten, Balken erhöhen, neu zeichnen bis DB Abfrage fertig
    5. System.Threading.Thread.Sleep(100) ' Hauptthread wartet, nicht die sauberste Lösung aber die einfachste
    6. If Fortschritt.Value < 10 Then Fortschritt.Value += 1 Else Fortschritt.Value = 0
    7. Me.Refresh()
    8. End While


    wobei Fortschritt = ProgressBar ist

    Der Balken rattert jetzt durch, solange die DB Abfrage dauert. Das klappt aber leider nur, wenn man das Fenster in Ruhe lässt.
    Sobald es verschoben oder von einem anderen Fenster verdeckt wird, hängt der Balken wieder, wird also net neugezeichnet (?).

    Hat einer eine Idee, wie man das idiotensicher gestalten könnte ??
    :)
    Du solltest in Deiner While Schleife gelegentlich die Kontrolle abgeben, d.h. den GUI-Thread nicht dauern blocken. Füge statt Me.Refresh doch mal ein Application.DoEvents ein und es sollte (hoffentlich) funktionieren.

    Ausserdem nach der Schleife Fortschritt auf 0 bzw 100 setzen ....
    Wahnsiiiiiiinnn!

    Es klappt total super ! Bin am hin und her schieben, minimieren, maximieren, der Balken rattert stur weiter!
    Cool, nur so eine kleine Änderung.

    Tausend Dank für die schnelle Antwort, dafür kriegst mindestens ein Bier ausgegeben :thumbsup:

    Dadurch wird es gleich viel robuster gegen den normalen Anwender.


    (nach der DB Abfrage wird die Bar bereits auf 100 gesetzt, war nur nicht im obigen Ausschnitt drin)