Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Steuerelement wird vom falschen Thread ausgeführt...

25 views
Skip to first unread message

James

unread,
Sep 30, 2006, 6:07:54 AM9/30/06
to
Habe von 101 VB.NET Samples das "Use Sockets" mal etwas verändert.

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


Peter Götz

unread,
Sep 30, 2006, 8:27:04 AM9/30/06
to
Hallo 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)

James Hanke

unread,
Sep 30, 2006, 12:04:07 PM9/30/06
to
Hallo Peter

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...

Peter Götz

unread,
Sep 30, 2006, 12:37:21 PM9/30/06
to
Hallo James,

> 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

James Hanke

unread,
Sep 30, 2006, 12:39:56 PM9/30/06
to
Hallo Peter

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...

Peter Götz

unread,
Sep 30, 2006, 1:03:36 PM9/30/06
to
Hallo James,

> Vielen Dank für Deine schnelle Antwort, läuft perfekt!

In der Online-Hilfe findest Du unter

"Behandeln von Ereignissen"

weitere Informationen.

Herfried K. Wagner [MVP]

unread,
Oct 1, 2006, 8:10:52 AM10/1/06
to
"James" <ja...@james.com> schrieb:

> 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.

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/>

0 new messages