Forum: PC-Programmierung VB - ShowDialog - Threadübergreifend close


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Abend there ^^

ich stehe vor einem Problem womit ich mich bereits mehrere Abende mit 
beschäftigt habe. Die vielen MSDN-Seiten und Links in der Suchmaschine 
ergaben auch keine Erfolge.

Es geht um ein Dialogfenster das als ShowDialog angezeigt wird. Dieser 
wiederum öffnet einen seriellen Port und erzeugt das dazugehörige 
EventHandler zum empfangen der Daten. Daten werden empfangen, alles gut. 
Nach dem Empfangen der Daten möchte ich den Port schließen und das 
Dialogfenster schließen. Beim Versuch des Schließens vom Dialogfenster 
erfolgt der Laufzeitfehler:
System.ObjectDisposedException: "Auf das verworfene Objekt kann nicht zugegriffen werden.
Objektname: "Dialog2"."

Mir ist klar dass dies ein threadübergreifender Fehler 
höchstwahrscheinlich ist. Habe bereits vieles versucht. Habe Invokes 
benutzt und was das I-Net noch zu bieten hatte. Schaut ma bitte drüber. 
LG Thomas
Public Class Dialog2

    Dim mySerialPort As New SerialPort("COM6")    

    Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
        CloseMe()
    End Sub

    Private Sub Dialog2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Serial_Port()
        mySerialPort.Open()
    End Sub

    Private Sub Dialog2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        mySerialPort.Close()        
    End Sub    

    Private Sub CloseMe()
        If Me.InvokeRequired Then
            Me.Invoke(New Action(AddressOf Me.Close))
            Exit Sub
        End If
        Me.Close()
    End Sub

    Public Sub Serial_Port()
        mySerialPort.BaudRate = 9600
        mySerialPort.Parity = Parity.None
        mySerialPort.StopBits = StopBits.One
        mySerialPort.DataBits = 8
        mySerialPort.Handshake = Handshake.None
        mySerialPort.RtsEnable = True
        mySerialPort.NewLine = vbCr

        AddHandler mySerialPort.DataReceived, AddressOf DataReceivedHandler

    End Sub


    Public Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
        Dim sp As SerialPort = CType(sender, SerialPort)
        PubVar.RFID_Data = sp.ReadLine 'PubVar ist ein Modul die die String-Variable RFID_Data enthält      
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
        If PubVar.RFID_Data IsNot Nothing Then
            Me.mySerialPort.Close()
            Me.CloseMe()
        End If
    End Sub

End Class

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Schicke dem Dialog eine WM_CLOSE-Nachricht, statt die Close-Funktion aus 
Deinem anderen Thread aufzurufen.

von Thomas F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp.
Vielen Dank.

LG
Thomas

von bluppdidupp (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ein Close() auf ein Form-Objekt macht intern (falls die Form bereits ein 
Handle hat):
SendMessage(NativeMethods.WM_CLOSE, 0, 0);

Wo wird denn das System.ObjectDisposedException geworfen und wie sieht 
der Stacktrace aus?
Vermutlich wird das Close() auch ausgeführt und Dialog2 gekillt, aber 
irgendwas versucht nach dem killen noch auf Dialog2 zuzugreifen.
Was das ist könnte am Stacktrace erkennbar sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.