Threadverletzung trotz invoke?

27/10/2009 - 22:56 von Manfred Brandes | Report spam
Hallo zusammen,

folgende Situation: Ich habe einen kontinuierlich laufenden Thread, über den
String-Nachrichten hereinkommen. Um diese threadsicher in eine ListBox
rauszuschreiben verwende ich die Sub SafeAddToListBox. Nun soll darüber
hinaus noch für jede Nachricht auch noch eine Instanz der Klasse Form2
erzeugt und dargestellt werden. Genau das bekomme ich aber nicht zum laufen.
Wenn ich nur die Zeile f.Show() auskommentiere, làuft es ohne Fehler, tue
ich das nicht wird eine "NullReferenceException - Der Objektverweis wurde
nicht auf eine Objektinstanz festgelegt" geworfen und zwar in der
invoke-Zeile in der anderen Sub. Ich verstehe erstens nicht warum sich das
so verhàlt und finde andererseits auch keinen Workaround. Darum hoffe ich
ihr könnt mir da weiterhelfen.

Viele Grüße und besten Dank,

Manfred

Private Sub SafeAddToListBox(ByVal MSG As String)
If ListBox1.InvokeRequired Then
Dim d As New myDelegate(AddressOf SafeAddToListBox)
ListBox1.Invoke(d, MSG) ' -- Hier wird der Fehler
geworden --
Else
ListBox1.Items.Add(MSG)
Call NewPopupWindow(MSG)
End If
End Sub

Private Sub NewPopupWindow(ByVal MSG As String)
Dim f As Form = New Form2

If Me.InvokeRequired Then
Dim d As New myDelegate(AddressOf NewPopupWindow)
Me.Invoke(d, MSG)
Else
f.Tag = New myClass(MSG)
f.Show()
End If
End Sub
 

Lesen sie die antworten

#1 Armin Zingler
27/10/2009 - 23:57 | Warnen spam
Manfred Brandes schrieb:
Hallo zusammen,

folgende Situation: Ich habe einen kontinuierlich laufenden Thread, über den
String-Nachrichten hereinkommen. Um diese threadsicher in eine ListBox
rauszuschreiben verwende ich die Sub SafeAddToListBox. Nun soll darüber
hinaus noch für jede Nachricht auch noch eine Instanz der Klasse Form2
erzeugt und dargestellt werden. Genau das bekomme ich aber nicht zum laufen.
Wenn ich nur die Zeile f.Show() auskommentiere, làuft es ohne Fehler, tue
ich das nicht wird eine "NullReferenceException - Der Objektverweis wurde
nicht auf eine Objektinstanz festgelegt" geworfen und zwar in der
invoke-Zeile in der anderen Sub. Ich verstehe erstens nicht warum sich das
so verhàlt und finde andererseits auch keinen Workaround. Darum hoffe ich
ihr könnt mir da weiterhelfen.

Viele Grüße und besten Dank,

Manfred

Private Sub SafeAddToListBox(ByVal MSG As String)
If ListBox1.InvokeRequired Then
Dim d As New myDelegate(AddressOf SafeAddToListBox)
ListBox1.Invoke(d, MSG) ' -- Hier wird der Fehler
geworden --
Else
ListBox1.Items.Add(MSG)
Call NewPopupWindow(MSG)
End If
End Sub

Private Sub NewPopupWindow(ByVal MSG As String)
Dim f As Form = New Form2

If Me.InvokeRequired Then
Dim d As New myDelegate(AddressOf NewPopupWindow)
Me.Invoke(d, MSG)
Else
f.Tag = New myClass(MSG)
f.Show()
End If
End Sub





Ich rate mal: Falls NewPopupWindow nur von SafeAddToListBox aus aufgerufen wird,
kann ich den Fehler spontan auch nicht erklàren. Ansonsten würde ich das
"dim f = new form2" in den Else-Zweig stecken weil du sonst die Form in dem
anderen Thread erzeugst und nicht in demselben, in dem "Me" erzeugt wurde.

Armin

Ähnliche fragen