Dort wird für jede Verbindung ein neuer User erstellt, und wenn daten einer
verbindung reinkommen (strings), werde ich in der Hauptform über ein Event
informiert und kann diese auswerten.
Funktioniert auch perfekt, wenn ich diese strings direkt auswerte. Jetzt
versuchte ich aber, so ein String in ein Treeview-Control als neuer node
einzufügen:
Dim oNode As New TreeNode
oNode.Text = strmessage
TreeView1.Nodes.Item(2).Nodes.Add(oNode)
Dann erhalte ich aber die Fehlermeldung:
Der für dieses Steuerelement ausgeführte Vorgang wird vom falschen Thread
ausgerufen. Marshallen Sie den richtigen Thread mit Control.Invoke oder
Control.BeginInvoke, um den Vorgang auszuführen.
Wenn ich aber den oben genannten code normal ausführen, z.b. als event eine
buttons, dann gehts...
Leider hab ich keine ahnung von invoken...
Kann mir da jemand helfen?
Vielen Dank!
James
> Dann erhalte ich aber die Fehlermeldung:
>
> Der für dieses Steuerelement ausgeführte Vorgang wird vom falschen
Thread
> ausgerufen. Marshallen Sie den richtigen Thread mit Control.Invoke
oder
> Control.BeginInvoke, um den Vorgang auszuführen.
Eigenschaften eines Controls dürfen nur von dem Thread geändert werden,
in dem das Control erstellt worden ist. Soll eine Eigenschaft des
Controls von einem anderen Thread aus verändert werden, muss der Aufruf
der entsprechenden Prozedur über einen Delegaten erfolgen.
Beispiel:
Delegate Sub SetTextCallBack(ByVal Text as String)
Private Sub SetText(ByVal Text as String)
if Textbox1.InvokeRequired Then
Dim myDelegate as New SetTextCallBack(AdressOf SetText)
Me.Invoke(myDelegate, Text)
else
Textbox1.Text = Text
end if
end Sub
Wird die Sub SetText() von dem Thread, der auch die Textbox erstellt
hat, aufgerufen, dann liefert Textbox.InvokeRequired den Wert False und
die Zeile Textbox1.Text = Text wird sofort ausgeführt.
Wird die Sub SetText() von einem anderen Thread aufgerufen, dann
liefert Textbox.InvokeRequired den Wert True.
Im Falle von Textbox.InvokeRequired = True wird in der SubText() erst
mal nicht die Eigenschaft Text der Textbox verändert, sondern die
Prozedur einfach erneut über den Delegaten aufgerufen. Danach liefert
Textbox.InvokeRequired den Wert False und die Zeile Textbox.Text = Text
wird ausgeführt.
> Wenn ich aber den oben genannten code normal ausführen, z.b. als
event eine
> buttons, dann gehts...
... weil in diesem Fall der auslösende Thread der selbe ist, in dem
Dein ListView und Dein Button erstellt worden sind.
> Leider hab ich keine ahnung von invoken...
s.oben:
jetzt hoffentlich schon.
> Kann mir da jemand helfen?
Melde Dich, wie hier in der NG üblich mit vollem Namen (Vor- u. Zuname)
nochmal, wenn das Beispiel oben noch nicht geholfen hat.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Vielen Dank für Deinen Code und die Erklärung. Verwende ich Deinen Code,
erhalte ich bei Me.Invoke(myDelegate, Text) eine Fehlermeldung "Der Wert des
Typs "String" kann nicht zu "1-dimensionales Array von System.Object"
konvertiert werden.
Was mache ich falsch?
Vielen Dank!
James Hanke
Delegate Sub SetTextCallBack(ByVal Text As String)
Private Sub SetText(ByVal Text As String)
If Textbox1.InvokeRequired Then
Dim myDelegate As New SetTextCallBack(AddressOf SetText)
Me.Invoke(myDelegate, Text)
Else
Textbox1.Text = Text
End If
End Sub
"Peter Götz" <gssg_...@t-online.de> schrieb im Newsbeitrag
news:OfQtetI5...@TK2MSFTNGP06.phx.gbl...
> Vielen Dank für Deinen Code und die Erklärung. Verwende ich Deinen
Code,
> erhalte ich bei Me.Invoke(myDelegate, Text) eine Fehlermeldung "Der
Wert des
> Typs "String" kann nicht zu "1-dimensionales Array von System.Object"
> konvertiert werden.
>
> Was mache ich falsch?
Ich habe was falsch gemacht.
Text muss natürlich in einem Array übergeben werden:
Delegate Sub SetTextCallBack(ByVal Text as String)
Private Sub SetText(ByVal Text as string)
If TextBox1.InvokeRequired Then
Dim ParArray(0) As String
ParArray(0) = Text
Dim myDelegate As New SetTextCallBack(AddressOf SetText)
Me.Invoke(myDelegate, ParArray)
Else
TextBox1.Text = Text
End If
End Sub
Gruß aus St.Georgen
Vielen Dank für Deine schnelle Antwort, läuft perfekt!
James
"Peter Götz" <gssg_...@t-online.de> schrieb im Newsbeitrag
news:Og82V5K5...@TK2MSFTNGP06.phx.gbl...
> Vielen Dank für Deine schnelle Antwort, läuft perfekt!
In der Online-Hilfe findest Du unter
"Behandeln von Ereignissen"
weitere Informationen.
Hintergrundinformationen:
Multithreading in Windows Forms-Anwendungen
<URL:http://dotnet.mvps.org/dotnet/faqs/?id=multithreading&lang=de>
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>