Invoke aus Thread

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

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von leonandroid.

    Invoke aus Thread

    Hi,
    ich habe einen TCP Listener in einem weiteren Thread. Dieser Listener wartet auf Antworten des Servers, ob die Anmeldung Erfolgreich war und darauf hin soll eine Methode in der Hauptform aufgerufen werden, die dann den Text von verschiedenen Labels anpassen soll.
    Allerdings kann man ja aus einem anderen Thread keine Controls steuern und deswegen hab ich gelesen, dass man dies mit Delegate und Invoke machen muss. Leider hab ich noch nicht so wirklich raus wie das geht:

    VB.NET-Quellcode

    1. Delegate Sub DelegatedResult(ByVal antwort As String)
    2. Private Sub Listen()
    3. While TCPclient.Connected
    4. Try
    5. Dim dummy As DelegatedResult = AddressOf Result
    6. dummy.Invoke(streamr.ReadLine)
    7. Catch
    8. MessageBox.Show("Verbindung zum Server nicht möglich!")
    9. End Try
    10. End While
    11. End Sub​


    Ich denke mal das ist völlig Falsch, oder? :S
    MfG. Leon

    leonandroid schrieb:

    oder
    Du probierst es mal so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private MyTcpClient As New TcpClient
    2. Delegate Sub DelegatedResult(ByVal antwort As String)
    3. Private Sub Listen()
    4. While MyTcpClient.Connected
    5. Try
    6. Using streamr As New StreamReader("PATH")
    7. Dim line = streamr.ReadLine
    8. Dim dummy As DelegatedResult = New DelegatedResult(AddressOf Result)
    9. dummy.Invoke(line)
    10. End Using
    11. Catch
    12. MessageBox.Show("Verbindung zum Server nicht möglich!")
    13. End Try
    14. End While
    15. End Sub
    16. Private Sub Result(antwort As String)
    17. MessageBox.Show(antwort)
    18. 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!
    Statt

    VB.NET-Quellcode

    1. dummy.Invoke(line)


    VB.NET-Quellcode

    1. formname.invoke(dummy,new object() {line})

    Aus dem Kopf

    Und in

    VB.NET-Quellcode

    1. Private Sub Result(antwort As String)
    2. MessageBox.Show(antwort)
    3. End Sub


    setzt dann dein Control also zb Label1.Text=antwort
    Das ist meine Signatur und sie wird wunderbar sein!

    leonandroid schrieb:

    dass man dies mit Delegate und Invoke machen muss.
    ist wenn man weiß wie's gemeint ist, richtig - sonst aber nicht.
    Also man muss einen Delegaten haben, und dann aber mit Control.Invoke delegieren, (ungefähr wie von Mono gezeigt). Nicht! mit Delegate.Invoke.

    Probierma

    VB.NET-Quellcode

    1. Private Sub Listen()
    2. While TCPclient.Connected
    3. Me.BeginInvoke(New Action(Of String)(Sub(txt)Label1.Text &= txt),streamr.ReadLine)
    4. End While
    5. End Sub
    Das wäre korrektes Invoken - Me ist das Control, was invokt
    Nur die Methode heisst falsch, denn was da vorgeht ist kein Listening-Prozess.
    Blos hat seine TcpListener-Klasse-A gar keine Form-Instanz verfügbar.

    Nun könnte man geneigt sein, ihr ein Form mitzuteilen, das wäre aber der falsche Weg.
    Korrekterweise sollte TcpListener-Klasse-A ein Event feuern, und das Form dieses Event empfangen, und erst beim Empfang - also im Form mit Me.BeginInvoke invoken.

    Etwa wie es in einschlägigen Tutorials gemacht ist, activevb.de/tipps/vbnettipps/tipp0149.html oder in TcpKommunikation + Networkstream
    Ein Problem dabei ist, dass man sich schon bischen auskennen muss mitte Programmiererei, also mit Events muss man sicher umgehen können, und auch aktiv implementieren können, sodass Klasse A ein Event feuert, bei Daten-Eingang.

    @TE: Und es nützt auch nichts, es trotzdem irgendwie anders zu versuchen, ohne die eiglich erforderlichen Kenntnisse. Dabei kann nur Mist herauskommen.

    Also ich fürchte, das Thema Tcp-Kommunikation ist einfach noch zu hoch.

    Also ich kann auch auf mein Event-Tut verlinken - Alles über Events - aber das ist auch kein wirklicher Anfänger-Stoff.
    Hey ErfinderDesRades,
    könntest du mir vielleicht doch noch ein paar weitere Infos bzw. Hilfestellungen geben? Ich komme bei den Links leider überhaupt nicht weiter und es wäre für mich wirklich schlimm, wenn ich deswegen mein ganzes Projekt einstampfen müsste. So wie ich es Probiere bekomme ich beim Invoken immer die Fehlermeldung, dass das Fenderhanlde zuerst erstellt werden müsste.

    MfG. Leon

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

    leonandroid schrieb:

    dass das Fenderhanlde zuerst erstellt werden müsste.
    Bei genau welcher Zeile?
    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!
    Das Fenster ist auf jedenfall schon erstellt, da ich den Befehlt über die Hauptform manuell aufrufe.
    Ich habe gerade bemerkt, dass mein Server, komischerweise, durchgehend leere Nachrichten bekommt, sobald ich mich mit diesem verbunden habe. :S
    ja, vermutlich grabschst du aus einem Thread auf die Default-Instanz des Hauptforms - wie gesagt:

    ErfinderDesRades schrieb:

    ... ich fürchte, das Thema Tcp-Kommunikation ist einfach noch zu hoch.

    Schnapp dir eines der gegebenen Tuts, die funktionieren, und bau darauf etwas auf, anstatt deine eigenen Versuche abzuschließen zu versuchen. Bei den Tuts weiß ich, dass die leidlich funktionieren, hingegen bei deim Teil kann noch endlos viel weiteres im Argen liegen.