Invoke Listview und ToolStripStatusLabel

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

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Invoke Listview und ToolStripStatusLabel

    Hallo Zusammen,

    ich habe mal eine Frage bezüglich des auslesen/setzen von GUI-Elementen aus einem anderen Thread. Ich habe es bereits hinbekommen, aus einem anderen Thread den Text eines Labels abzuändern, aber bei einem ToolStripStatusLabel streikt es. Mittels Google habe ich bereits herausgefunden, dass es hier keine InvokeRequired-Methode gibt, da es sich nicht um ein Control, sondern um ein Component handelt. Wie kann ich nun den Text im StatusStriplabel ändern aus meinem Thread?

    Hier einmal mein ganzes Testprojekt um das Invoken zu verstehen, sowie das Erstellen von Threads.

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Imports System.Threading
    3. Public Class Form1
    4. Private WithEvents FFmpeg As New Process
    5. Dim input As String = "C:\Users\Marvin\Desktop\test.m4a"
    6. Dim output As String = "C:\Users\Marvin\Desktop\test.mp3"
    7. Public cthread As Thread
    8. Public Delegate Sub SetTextCallback(ByVal value As String)
    9. Private Sub SetText(ByVal [text] As String)
    10. If Me.Label1.InvokeRequired Then
    11. Dim d As New SetTextCallback(AddressOf SetText)
    12. Me.Invoke(d, New Object() {[text]})
    13. Else
    14. Me.Label1.Text = [text]
    15. End If
    16. End Sub
    17. Public Sub convert()
    18. With FFmpeg
    19. .StartInfo.FileName = Path.Combine(Application.StartupPath, "ffmpeg.exe")
    20. FFmpeg.StartInfo.Arguments = "-i " & input & " -f mp3 -ab 160000 -acodec libmp3lame " & output
    21. FFmpeg.Start()
    22. Do Until .HasExited
    23. Loop
    24. SetText("Testtetstetsts")
    25. .Close()
    26. MessageBox.Show("Konvertierung abgeschlossen", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
    27. End With
    28. End Sub
    29. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    30. cthread = New Thread(AddressOf convert)
    31. cthread.Start()
    32. End Sub
    33. End Class


    Bezüglich auslesen einer Listview:
    Wie kann ich diese in einen anderen Thread auslesen?

    LG Marvin

    MarvinKleinMusic schrieb:

    VB.NET-Quellcode

    1. If Me.Label1.InvokeRequired Then
    machst Du

    VB.NET-Quellcode

    1. If Me.InvokeRequired Then
    Allerdings kann ich den ToolStripLabel-Textaus einem BGW heraus und aus Deiner Thread-Prozedur ändern, ohne dass es knallt. Bei einem normalen Label knallt es beim Thread, nicht aber beim BGW, der tut einfach nix. Mit anderen Worten: Du hast keinen Handlungsbedarf.
    Try this:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class Form1
    3. Public cthread As Thread
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. ' BGW starten
    6. Me.BackgroundWorker1.RunWorkerAsync()
    7. End Sub
    8. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    9. ' Thread starten
    10. Me.cthread = New Thread(AddressOf Me.convert)
    11. Me.cthread.Start()
    12. End Sub
    13. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    14. ' Text im GUI-Thread setzen
    15. Me.ToolStripLabel1.Text = "GUI-Thread"
    16. Me.Label1.Text = "GUI-Thread"
    17. End Sub
    18. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    19. ' Text im BGW setzen
    20. Me.ToolStripLabel1.Text = "BGW"
    21. Me.Label1.Text = "BGW" ' knallt nicht, tut nix
    22. End Sub
    23. Public Sub convert()
    24. ' Text im Thread setzen
    25. Me.ToolStripLabel1.Text = "Thread"
    26. Me.Label1.Text = "Thread" ' knallt
    27. End Sub
    28. End Class
    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!