VB, wie zwischen 2 Threads Informationen austauschen zwecks Label.text

  • VB.NET

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

    VB, wie zwischen 2 Threads Informationen austauschen zwecks Label.text

    Hallo Programmierer !

    Ich brauche Hilfe bei einen Problem mit 2 Threads. Der erste Thread ist der "normale" von der dem GUI. In diesem Thread mache ich eine Schnittstelle auf um daten zu empfangen. Das Control welches das bewerkstelligt legt darauf ein Event (DataReceivedHandler) an welches aufgerufen wird, wenn Daten da sind. Aus dieser SUB möchte ich dann ein Label10.Text beschreiben (mit dem Wert der Daten). Wie mache ich das ? Bitte für ganz doofe erklären. TD wie Tausend Dank!!



    hier der Code (VB2012)
    -----------------------------

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3. Dim mySerialPort As New SerialPort("COM4")
    4. Pivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Label10.Text(" Im dem gleichen Thread, das geht!")
    6. End Sub
    7. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    8. mySerialPort.BaudRate = 9600
    9. mySerialPort.Parity = Parity.None
    10. mySerialPort.StopBits = StopBits.One
    11. mySerialPort.DataBits = 8
    12. mySerialPort.Handshake = Handshake.None
    13. mySerialPort.RtsEnable = True
    14. AddHandler mySerialPort.DataReceived, AddressOf DataReceivedHandler
    15. mySerialPort.Open()
    16. Label10.Text = ""
    17. End Sub
    18. Private Shared Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
    19. Dim Anzahl_Bytes As Integer ' Anzahl der bytes die warten
    20. Dim Bytes(100) As Byte ' gelesenes Byte
    21. Dim Read_Bytes(100) As Byte
    22. Dim InByte As Byte
    23. Dim X As Integer
    24. Dim Y As Integer
    25. Dim Z As Integer
    26. Dim Start As Integer
    27. Dim Ende As Integer
    28. Dim Tem1 As Byte
    29. Dim Tem2 As Byte
    30. Dim sp As SerialPort = CType(sender, SerialPort)
    31. Dim InData As String
    32. Anzahl_Bytes = sp.BytesToRead 'sind noch Bytes zu lesen da ?
    33. For X = 1 To Anzahl_Bytes
    34. Bytes(X) = sp.ReadByte
    35. Bytes(0) = X
    36. Next
    37. ' Hier will ich auf das Label10.Text aus der Form zugreifen bzw. beschreiben !
    38. ' Wie wird das gelöst ?
    39. Label10.Test = Byte2String(Bytes(1)
    40. End Sub
    41. End Class
    Willkommen im Forum. :thumbup:

    Fileplayer schrieb:

    Schnittstelle
    So was:

    VB.NET-Quellcode

    1. Sub DataReceivedHandler(...)
    2. Dim txt = SerialPort1.ReadExisting()
    3. Me.Invoke(Sub() ReceivedText(txt))
    4. End Sub
    5. Sub ReceivedText(String txt)
    6. End Sub
    Funktioniert mit Bytes ganz genau so.
    Sieh Dir die Methoden zum Auslesen von Bytes an:
    Anzahl ermitteln, Array dimensionieren, befüllen und bearbeiten.
    3 Zeilen.
    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!
    Hallo RodFromGermany,

    Danke für die Antwort !
    aber das funktioniert nicht bzw so nicht. War wohl nicht für doofe geeignet, na ja. Ich wollte auch wissen wie ich was eintragen muß (in meinen Quelltext) das ich an der Stelle

    ' Hier will ich auf das Label10.Text aus der Form zugreifen bzw. beschreiben !
    Label10.Text = Byte2String(Bytes(1))

    das Label10 beschreiben kann.

    Wenn Du lust hast kannst du ja mir nochmal antworten. Ich würde mich freuen !

    Gruss Günni

    Fileplayer schrieb:

    das Label10 beschreiben
    Zieh Dir das SerialPort im Designer auf die GUI, da kannst Du die meisten Properties im Designer bearbeiten.
    Zunächst musst Du herausbekommen, ob die Daten der Gegenstelle als Bytes oder Strings zu interpretieren sind. Du empfängst in Deinem Beispiel nämlich Bytes und konvertierst sie iwie in Strings um.
    Hab Vertrauen zu Bill, er hat dies vorhergesehen und gestattet es Dir, dies mit nem Einzeiler zu programmieren.
    Du musst dem Port bei der Initialisierung lediglich das Encoding mitteilen, da werden die gesendeten 1-Byte-Zeichen automatisch in .NET-Unicode konvertiert.
    Und wenn Du noch herausbekommst, welche Zeichen das Zeilenende einer einzelnen Übertragung markieren, kannst Du dies dem Port ebenfalls mitteilen und dann einfach mit SerialPort1.WriteLine("abc") bzw. Dim txt = SerialPort1.ReadLine() arbeiten.
    Das Port initialisierst und öffnest Du zu Beginn der Laufzeit des Programms und schließt es bei Beendigung des Programms.
    Und dann sieht Dein Code etwa so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. [/spoiler][spoiler]Private Sub InitPort()
    2. ' diese Properties werden im Designer nicht angeboten:
    3. Me.SerialPort1.Encoding = System.Text.Encoding.UTF8
    4. ' passend zu ReadLine() und WriteLine()
    5. Me.SerialPort1.NewLine = ControlChars.CrLf
    6. Me.SerialPort1.Open()
    7. End Sub
    8. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    9. Dim txt = SerialPort1.ReadLine()
    10. Me.BeginInvoke(Sub() DoIt(txt))
    11. End Sub
    12. Private Sub DoIt(txt As String)
    13. Me.TextBox1.AppendText(txt)
    14. 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!

    RodFromGermany schrieb:

    Willkommen im Forum. :thumbup:

    Fileplayer schrieb:

    Schnittstelle
    So was:

    VB.NET-Quellcode

    1. Sub DataReceivedHandler(...)
    2. Dim txt = SerialPort1.ReadExisting()
    3. Me.Invoke(Sub() ReceivedText(txt))
    4. End Sub
    5. Sub ReceivedText(String txt)
    6. End Sub
    Funktioniert mit Bytes ganz genau so.
    Sieh Dir die Methoden zum Auslesen von Bytes an:
    Anzahl ermitteln, Array dimensionieren, befüllen und bearbeiten.
    3 Zeilen.


    Könnte man mit der Invoke Methode auch aus einen Thread
    Arbeiten? oder gibt es dort noch etwas zu beachten? Gehört
    zwar nicht ganz zum Thema allerdings scheint es eine nette
    Funktion zu sein. LG Steven

    /e
    Ich hätte mal den Title lesen sollen, hat sich erledigt danke.

    Steven schrieb:

    Könnte man mit der Invoke Methode auch aus einen Thread Arbeiten?
    Invoke / BeginInvoke dient dazu, aus einem Nebenthread auf GUI-Elemente im Main-Thread zuzugreifen.
    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!