Forums Neueste Beiträge
 

Threadübergreifender Zugriff einfacher Lösen?

25/03/2008 - 19:33 von Jens Duczmal | Report spam
Guten Abend,

so, sorry erst einmal, das ich mich in dem My.Forms-Thread nicht
weiter engagiert habe. Die Grundlagendiskussion hatte ich mir aber
durchgelesen. Ich fühle mich aber nicht befugt, mich dazu zu àußern :-)

Mein generelles Problem (auch die My.Forms-Geschichte) hat mit
meinen Threadübergreifenden Zugriffen zu tun. So schlau bin ich jetzt.


Ich habe ein VB.NET exe die eine GUI zur Verfügung stellt.
Und z.B. eine VB6.EXE die diese GUI dann "füllen" soll.
Das ganze geschieht über eine VB.NET.dll mit entsprechenden
Interfaces.

Ergo: Ich will aus der VB6-Anwendung eine komplette MenuBar
sowie mehrere Toolbars erstellen und spàter dann per Events
auf die Click-Ereignisse reagieren können.

Nein, ich kann keine DLL daraus erstellen. Theoretisch schon,
aber das ganze soll auch mit Access laufen, und spàtestens
da müsste ich passen. :-)


So weit so gut. Ich habe heute bemerkt, das ich eben
besagte Cross-Threading-Zugriffe habe und deshalb keine
Toolbars etc. zur Laufzeit erstellt werden können.

Problem habe ich bereits mit Invoke gelöst.

Was mir nun aber überhaupt nicht gefàllt ist, das ich
ja auch noch etliche Eigenschaften der einzelnen
ToolStripItems nach außen leiten möchte.

Nicht alle, aber so rund ein Dutzend sind das schon.

MIr graut davor, für jede einzelne Property ein
Delegate definieren zu müssen und Invoke aufzurufen.
Also irgendwie schüttelt sich bei mir alles, wenn ich
daran denke. Das muss doch auch einfacher gehen.

Oder kommt man gar nicht erst auf so "bekloppte" Ideen
der Steuerung von außen :-)

Gibt es da nicht irgendwo einen Kniff in dem ich
die komplette Toolbar oder zumindest ein ganzes
ToolStripItem per Delegate/Invoke aus dem richtigen Thread abgreifen
kann und dann einfach wie "üblich" auf die einzelnen Properties
zugreifen kann?

Irgendwas in der Art

Delegate Function GetItem_Del(ByVal Name As String) as ToolStripItem


Dim myMethod As New GetItem_Del(AddressOf Del_GetItem)
dim testItem as ToolStripItem
Dim obj(0) As Object
obj(0) = Name
testItem = Main.frmMain.ToolStrip.Invoke(myMethod, obj)


Mit rumspielen komme ich nicht wirklich weiter.
Sofern testItem zugewiesen worden ist, bin ich ja wieder
"im alten" Thread und habe wieder die Zugriffsprobleme.
Wàre nur zu schön, wenn das irgendwie gehen würde.

Ich weiss, das es nur "fleissarbeit" ist, alle Props
so durchzuleiten. Aber den Quellcode auf diese Art und Weise
fast zu verdoppeln kann doch nicht richtig sein.


Gruß,
jens Duczmal
 

Lesen sie die antworten

#1 Jens Duczmal
25/03/2008 - 19:58 | Warnen spam
Hm...eine Anmerkung noch dazu.

Ich teste gerade zusàtzlich ein paar GUI-Komponenten
von DevComponents.

Interessanterweise kann ich von meinem externen Thread aus
in deren Toolbar problemlos Items hinzufügen. Ohne Invoke.

Bug oder Feature?

Ich meine gelesen zu haben, das so etwas definitiv nicht
von Windows.Forms.Controls unterstützt wird. Zumindest
nicht ByDefault.

Und wenn es denn doch gehen sollte, dann nicht unbedingt
sicher. d.h. es können spàter doch mal ungeahnte Probleme
auftreten.

Ist das grundsàtzlich so? Ich meine die sind in C++/C# geschrieben.
Vielleicht kann C da ja wieder mehr? Der Quellcode ist dort
mit kàuflich, insofern würde ich mich da glatt noch
auf Drittkomponenten einlassen.

Nicht wegen Invoke, sondern wegen der restlichen Controls
die die anbieten. Nicht, das Ihr denkt ich wàre faul ;-)

Jens

Ähnliche fragen