Label während der Verarbeitung laufend aktualisieren

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Label während der Verarbeitung laufend aktualisieren

    Hi,

    ich habe eine Anwendung, die in einer Schleife Tausende von Files verarbeitet. Jetzt würde ich gern während der Verarbeitung im Label lblMessageanzeigen, welcher File gerade an der Reihe ist ...

    Bisher habe ich dazu folgendes Coding verwendet:

    VB.NET-Quellcode

    1. lblMessage.Text = "Processing: " & myFile
    2. Me.Refresh()


    Das funktioniert zwar aber es scheint mir sehr inperformant zu sein, weil ja jedes Mal das KOMPLETTE Window neu gemalt wird. Und aus diesem Grund kommt es wohl auch dazu, dass der Bildschirm flackert.

    Das würde ich gern vermeiden. Gibt es denn eine Möglichkeit etwa nur das Label neu zu malen ... ?

    LG
    Peter
    @Peter329 Machst Du

    VB.NET-Quellcode

    1. lblMessage.Refresh()
    2. ' oder
    3. lblMessage.Update()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    PSJ schrieb:

    aktualisiert werden ?
    Ja.
    Das Verhalten von VB.NET und C# ist hier identisch.
    Teste dies mit und ohne Me.Label1.Update().

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For i = 1 To 10
    3. Me.Label1.Text = i.ToString
    4. Me.Label1.Update()
    5. System.Threading.Thread.Sleep(100)
    6. Next
    7. Me.Label1.Text = "Feddich"
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Label müssen aktualisiert werden. Es ist wohl so, dass die Methode Me.Refresh erst am Ende der Click Prozedur standardmäßig aufgerufen wird. Zwischendurch kann man die Label also verändern wie man will, ohne dass das sichtbar wird.

    Die Sache mit label.Update() klappt hervorragend. Und ganz offensichtlich bringt das gegenüber Me.Refresh() auch erheblichen Performance Gewinn. Ich habe jetzt keinen Benchmark Test gemacht, aber bei meiner Anwendung führt das ganz offensichtlich zu spürbar kürzer Laufzeit. Und das blöde Flackern ist auch weg. Ich bin begeistert! :)

    Vielen Dank an die Ratgeber!

    LG
    Peter
    Jetzt hab ich doch noch eine wichtige Anmerkung:

    Wenn das Label etwa in einer GroupBox enthalten ist, dann wird das alte Label nicht vollständig gelöscht. Hier ein Test:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim strMessage As String() = {"hugo",
    3. "hugoline",
    4. "alfred",
    5. "susi",
    6. "mathilda nimm die Hand da weg!",
    7. "erdogan "}
    8. For i = 0 To strMessage.Count - 1
    9. Me.Label1.Text = strMessage(i)
    10. Me.Label1.Update()
    11. System.Threading.Thread.Sleep(2000)
    12. Next
    13. End Sub


    Nach "Mathilda nimm die Hand da weg" erscheint dann "Erdogan nimm die Hand da weg" ... erst nach dem Ende der Button1 Prozedur wird das dann vom Me.Refresh() zu "Erdogan" verkürzt. So wie es sich ja auch gehört! :)

    Ich hab das jetzt dahingehend gelöst, dass ich statt Me.Label1.Update() einfach Me.GroupBox1.Update() kodiert habe. Dadurch erhöht sich der Overhead allerding wieder ein bissl. Das macht sich aber nur bemerkbar, wenn man nicht 5 sondern vielleicht 10.000 Schleifendurchläufe hat.

    LG
    Peter
    @Peter329 Sehr interessant, wenn der Text kürzwer wird, passiert das.

    VB.NET-Quellcode

    1. Me.GroupBox1.Refresh()
    2. Me.Label1.Refresh()
    Refresh() und Update() geht beides.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!