Form in Form öffnen mit Serial Port

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von gogede.

    Form in Form öffnen mit Serial Port

    Denke versteh die Umstellung von VB6 auf Vb net nicht ganz

    Zustand:
    Ich starte mein Projekt mit dem Form "start"
    in diesem Form "start" öffne ich einen SerialPort um lesen ob ein Input kommt
    Gleichzeitig wird im form "start" ein form "Login" aufgerufen
    das form "start" wird nicht geschlossen

    jetzt kommt via SerialPort eine Input, jetzt müsste das "Login" geschlossen werden und eine neues Form "erfassen" geöffnet werden.
    Nun hab ich das Problem dass beim Input auf dem Serial Port das Form nicht geschlossen (hide) wird oder stehts folgende Fehlermeldung kommt
    "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Login erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

    Kann mir jemand da weiterhelfen, ich bin am Verzweifeln! Danke

    Code wäre ungefähr so:

    Dim frmLogin As New login
    dim frmErfassen as new erfassen

    Private Sub start_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    call fcOpenSerial
    frmLogin.show

    End Sub

    Private Sub fcOpenSerial
    SerialPort1.PortName = "COM16"


    .
    .
    .

    SerialPort1.Open()

    AddHandler SerialPort1.DataReceived, AddressOf DataReceivedHandler


    END SUB

    Private Sub DataReceivedHandler(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)

    Dim sp As SerialPort = CType(sender, SerialPort)

    Dim indata As String = sp.ReadExisting()

    Dim formTitles As New Collection



    If Len(indata) > 5 Then
    frmErfassen.show
    frmlogin.hide *** Hier Kommst der Fehler!!!!
    end if
    End SUb
    Willkommen im Forum. :thumbup:

    gogede schrieb:

    Ungültiger threadübergreifender Vorgang
    Ja, das ist eines der neuen Features unter .NET, dass Dinge aus dem GUI-Thread in einen anderen Thread ausgelagert werden (können).
    Bei Dir findet der Empfang serieller Daten in einem anderen Thread statt.
    Da nun viele dieser anderen Threads parallel laufen können und die PCs über CPUs mit mehreren Kernen verfügen, kann es vorkommen, dass 2 dieser Threads gleichzeitig auf ein GUI-Element zugreifen, der eine sagt "Hüh", der andere "Hott".
    Um dies zu verhindern, dürfen Nebenthreads nicht schreibend auf GUI-Elemente zugreifen.
    Damit das aber funktioniert, muss die betreffende Aktion in den GUI-Thread invoked werden.
    Statt

    VB.NET-Quellcode

    1. Me.Label1.Text = "bla"
    machst Du

    VB.NET-Quellcode

    1. Me.BeginInvoke(Sub() Me.Label1.Text = "bla")
    und schon spricht die Nachbarin wieder mit Dir.
    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!