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)


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:
1
System.ObjectDisposedException: "Auf das verworfene Objekt kann nicht zugegriffen werden.
2
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
1
Public Class Dialog2
2
3
    Dim mySerialPort As New SerialPort("COM6")    
4
5
    Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
6
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
7
        CloseMe()
8
    End Sub
9
10
    Private Sub Dialog2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
11
        Serial_Port()
12
        mySerialPort.Open()
13
    End Sub
14
15
    Private Sub Dialog2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
16
        mySerialPort.Close()        
17
    End Sub    
18
19
    Private Sub CloseMe()
20
        If Me.InvokeRequired Then
21
            Me.Invoke(New Action(AddressOf Me.Close))
22
            Exit Sub
23
        End If
24
        Me.Close()
25
    End Sub
26
27
    Public Sub Serial_Port()
28
        mySerialPort.BaudRate = 9600
29
        mySerialPort.Parity = Parity.None
30
        mySerialPort.StopBits = StopBits.One
31
        mySerialPort.DataBits = 8
32
        mySerialPort.Handshake = Handshake.None
33
        mySerialPort.RtsEnable = True
34
        mySerialPort.NewLine = vbCr
35
36
        AddHandler mySerialPort.DataReceived, AddressOf DataReceivedHandler
37
38
    End Sub
39
40
41
    Public Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
42
        Dim sp As SerialPort = CType(sender, SerialPort)
43
        PubVar.RFID_Data = sp.ReadLine 'PubVar ist ein Modul die die String-Variable RFID_Data enthält      
44
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
45
        If PubVar.RFID_Data IsNot Nothing Then
46
            Me.mySerialPort.Close()
47
            Me.CloseMe()
48
        End If
49
    End Sub
50
51
End Class

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


Lesenswert?

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

von Thomas F. (Gast)


Lesenswert?

Danke für den Tipp.
Vielen Dank.

LG
Thomas

von bluppdidupp (Gast)


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]
  • [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.