Thread-Problem (Ungültiger threadübergreifender Vorgang)

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Analegrande.

    Thread-Problem (Ungültiger threadübergreifender Vorgang)

    Ich habe mir schon dieses Thema hier durchgelesen: [VB 2008] Zwei Threads auf ein Steuerelement(nicht gleichzeitig: Fehler) aber ich raff es einfach nicht. Vieleicht müsste ich es wie für einen 7 Jährigen erklärt bekommen :P

    Zum Problem...

    Ich habe ein Label auf der Form (label1.text = 0)

    Nun hab ich mir Thread deklariert für eine Sub.
    (Dim Thread1 As New Thread(AddressOf BlaSub))

    In dieser Sub habe ich eine For-schleife welche bei einem besonderen Ereigniss den Labeltext um 1 erhöhen soll. ( Label1.text += 1 )

    Und da hörts auch schon auf...

    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Zu dem Fehler bekomm ich noch ein msdn-Link der mir aber nicht weiter hilft.
    msdn.microsoft.com/de-de/library/ms171728.aspx

    Vieleicht findet jemand von euch die Lösung dort.

    MFG
    Wo ist das Problem :P
    Mach es doch einfach genau so, wie Mad Andy es geschrieben hat nur mit 2 änderungen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Delegate Sub WriteTextDelegate(ByVal Target As Label, ByVal Text As String)
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim Thread As New Threading.Thread(AddressOf Test)
    5. Thread.Start()
    6. End Sub
    7. Private Sub Test()
    8. For i = 0 To 123456
    9. Dim Params(1) As Object
    10. Params(0) = Label1
    11. Params(1) = i.ToString
    12. Me.Invoke(New WriteTextDelegate(AddressOf WriteText), Params)
    13. Next
    14. End Sub
    15. Public Sub WriteText(ByVal Target As Label, ByVal Text As String)
    16. Target.Text = Text
    17. End Sub
    18. End Class


    Du ersetzt einfach das ByVal Target as Textbox durch Label ;)
    Hallo!

    Nur zum besseren Verständnis:
    Dein eigentliches Programm läuft im ersten Thread, wenn du
    nun einen zweiten öffnest, dann kann jener nicht auf Elemente
    des ersten zugreifen.
    Dies ist auch sehr sinnvoll, da beide komplett autark zueinander laufen.
    Nun stell dir einmal vor, was passierte, wenn der erste Thread beendet
    wird, jedoch der zweite Thread noch läuft und auf Elemente des ersten
    zugreifen möchte - richtig, es kommt zu einer Ausnahme.
    Zwar habe ich dieses Verhalten auch schon oft verflucht, aber die einzige
    Möglichkeit besteht, wie meine Vorschreiber bereits beschrieben, in der Benutzung
    einer Methoden, welche mit invoke aufgerufen wird.
    Danke, ich bin ein Stück weiter gekommen und bin sicher das ich nach ein bischen rumtüffteln das Ergebniss so hin kriege wie ich es möchte ^^
    Vieleicht hab ich mich nur etwas zu dumm angestellt mit Hilfe des anderen Threads :S

    Gruss Anale