Threadsicheres Zugreifen auf eine Form

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von TimBo93.

    Threadsicheres Zugreifen auf eine Form

    Hi,



    ich habe heute sehr viele Beiträge aus diesem Forum durchgelesen, die sich mit dem Zugriff auf die Form aus einem externen Thread beschäftigen.

    Der Code ist in einer externen Klasse (also nicht in der Klasse Form) und wird in einem anderem Thread aufgerufen. Wie kann ich trotzdem darauf zugreifen?

    Da kam oft was mit Invoke und BackgroundWorker , aber ich verstehe einfach nicht , was diese Teile bringen sollen. ?(



    Danke schonma ^^

    TimBo
    Visual Basic FTW :D
    Programmiere u.a. mit C# (XNA), Blitz Basic 3D, BlitzPlus , PHP.
    In C# mache ich es auch mit Invoke.
    Hier mal ein Beispiel, wenn du den Text der richtextbox aus einem anderen Thread ändern willst:

    Quellcode

    1. this.richTextBox1.Invoke((MethodInvoker)delegate() { richTextBox1.Text = ""; } );


    Kannst du ja einfach umschreiben, wobei es wahrscheinlich noch elegantere Lösungen gibt.
    wie geht man mit Invoke und Delegaten um?
    will gar keinen Code schnorren, ich verstehe das Prinzip dahinter einfach nicht. Ist ein Delegat (?) ein Funktionszeiger und mit Invoke kann ich dann diese Funktion aufrufen? Aber warum muss man das so umständlich mit den Zeigern machen? Ich hab das Gefühl, dass ich total auf der falschen Spur bin. :cursing:



    Fertiger Code bringt mir da leider nicht so viel.
    Visual Basic FTW :D
    Programmiere u.a. mit C# (XNA), Blitz Basic 3D, BlitzPlus , PHP.

    VB.NET-Quellcode

    1. Delegate Sub SetTextCallback(ByVal text As String)
    2. Private Sub SetText(ByVal [text] As String)
    3. ' InvokeRequired required compares the thread ID of the
    4. ' calling thread to the thread ID of the creating thread.
    5. ' If these threads are different, it returns true.
    6. If Me.Label1.InvokeRequired Then
    7. Dim d As New SetTextCallback(AddressOf SetText)
    8. Me.Invoke(d, New Object() {[text]})
    9. Else
    10. Me.Label1.Text = [text]
    11. End If
    12. End Sub


    msdn.microsoft.com/de-de/library/ms171728.aspx (Quelle von dem Code.)

    was soll das SetTextCallBack dastellen ? SetTextCallback wird bei mir immer unterstrichen....
    Visual Basic FTW :D
    Programmiere u.a. mit C# (XNA), Blitz Basic 3D, BlitzPlus , PHP.
    SetTextCallBack ist die Delegate Routine, aber ich nutze das meist nicht so.

    VB.NET-Quellcode

    1. Private Delegate SetTextA(ByVal Text As String)
    2. Private Sub Timer_Elapse()
    3. Me.Invoke(New SetTextA(AddressOf SetText), Text)
    4. End Sub
    5. Private Sub SetText(ByVal Text As String)
    6. Label1.Text = Text
    7. End Sub


    Heißt über den Delegate SetTextA wird die Sub Routine SetText aufgerufen und die Variable übergeben.
    du meinst doch "Pivate Delegate Sub (...)" oder ?

    also jetzt kann ich schonmal in der Klasse Form1 eine Sub ausführen, die mir dann das gewünschte Resultat liefert.

    Wenn ich jetzt diese Sub (die in Form1 als Public geschrieben wurde) in einer Class Verbindung ausführe, dann kommt:

    Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.



    In der anderen Klasse:

    VB.NET-Quellcode

    1. Form1.Nana("Test")



    in der Form Klasse:

    VB.NET-Quellcode

    1. Private Delegate Sub SetTextA(ByVal Text As String)
    2. Public Sub Nana(ByVal Text As String)
    3. Me.Invoke(New SetTextA(AddressOf SetText), Text)
    4. End Sub
    5. Private Sub SetText(ByVal text As String)
    6. Label1.Text = text
    7. End Sub
    Visual Basic FTW :D
    Programmiere u.a. mit C# (XNA), Blitz Basic 3D, BlitzPlus , PHP.
    asynchrone proggrammiererei impliziert mehrere Anforderungen:
    1) Code wird in einem NebenThread ausgeführt
    2) der Nebenthread kann Notifikationen an den Main-Thread schicken (weil das ist der einzige thread, der was anzeigen kann)
    3) zum Start des nebenthreads müssen Controls verändert werden (etwa buttons disablen)
    4) zum Ende muß der vorherige Gui-Zustand wiederhergestellt werden

    Jo, dazu habich ein Codeproject-Artikel gemacht: AsyncWorker - CodeProject
    oha 8|

    programmiere zwar gerade einen MultiServer (der steht soga schon) und wollte jetzt eine schicke ListBox mit allen Playern etc. machen, aber dieser Aufwand lohnt sich glaube ich nicht. :(

    Edit: ich mache es jetzt mit einem Timer , der mir alle Sachen alle Sekunde neu macht, so ist die Aktualisierung eine Sekunde max. verschoben.

    Vielen Dank an alle !

    TimBo
    Visual Basic FTW :D
    Programmiere u.a. mit C# (XNA), Blitz Basic 3D, BlitzPlus , PHP.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TimBo93“ ()