Threadübergreifende Form Initialisierung

Kaffeeschlürfer

Grünschnabel
Nabend!

Folgender Istzustand:

Eine vb.net Windows-Anwendung (exe) läd 2 Plugins (dll) zur Laufzeit über ein definiertes Interface IPlugin.

Plugin a) ist eine Server-Client Verbindung (mehrere Threads)
Plugin b) ist ein Chat-Plugin (einfache User-User Chats ähnlich ICQ)

Plugin a) stellt eine Verbindung zu einem Server her und Teilt mittels Events der Anwedung mit, das User X und User Y exisiteren. Die Anwendung teilt diese Information mit allen anderen Plugins, also auch mit Plugin b). Somit kann nun User X dem User Y eine Nachricht schicken.

Dies wird folgenderweise geregelt:
In der Anwendung besteht eine ListBox mit allen Usern. Ein Rechtsklick auf diese Liste fragt nun bei allen Plugins nach, ob sie etwas zu einem Contextmenü hinzufügen möchten, welches dann angezeigt wird. Dies tut auch Plugin b) und fügt einen "Chat" Eintrag im Contextmenü hinzu, dessen Click_Event Handler in der Plugin b) dll liegt.

Wenn man nun auf "Chat" klickt, löst das Click_Event in Plugin b) eine Funktion aus, die eine neue Instanz eines in Plugin b) befindlichen Forms "frmChat" initialisiert. Dort kann dann User X den Text eintragen, den er User Y schicken möchte.

So weit - so gut.

Mein Problem besteht jetzt darin. Das bei User Y, der auf seiner Seite noch keine Instant von frmChat für einen Chat zu User X besteht. In meiner Bisherigen annahme passiert also Folgendes:

Plugin a)->erhält eine eingehende Nachricht und reagiert mit einem RaiseEvent

Die Windows-Anwendung->reagiert auf diese Nachricht und ruft bei allen Plugin-Instanzen eine IncomingMessage(String msg) Methode auf

Plugin b)->wird nun von der Windows-Anwendung aufgerufen und soll diese Nachricht anzeigen. Da noch kein Fenster für diesen User existiert muss eins angelegt werden.

Folgender Code wird sowohl beim Klick auf den "Chat" Kontextmenü Eintrag als auch bei diesem Eingehenden Event aufgerufen:

Private Function getNewChatWindow(ByRef user As KPIShared.UserContact) As frmChat
Dim cw As New ChatWindowItem ' Neues Item für die collection der Bestehenden Chat-Fenster
Dim form As New frmChat() ' Neue Instanz der Formulars

cw.chatwindow = form ' fenster objekt in das Collection Item verweisen
cw.user = user ' user objekt in das Colletion Item verweisen

form.user = user ' Das Chat formular weiss auch mit welchem User es chattet
cc.Add(cw) ' das Collection Item in die Collection aufnehmen

Return form ' neue Instanz zurückgeben
End Function

Dies Resultiert in folgenden 2 Endergebnissen:
1)Durch den Klick auf "Chat" landet man in meinen Augen (korrigiert mich wenn ich falsch liege :) ) in dem Thread der DLL b) (oder der Windows-Anwendung)
--- Das entstandene Fenster funktioniert 1a

2) Durch die Reaktionskette von Plugin a) über die Anwendung zu Plugin b) ist es ein anderer Thread, der nun diese Funktion Aufruft als beim klick auf "Chat"
--- Das entstandene Fenster wird weiß und reagiert auf keine Eingaben mehr.

/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Ich suche nun nach einer Lösung wie beide Aufrufe in einem Thread erfolgen können oder wie ich den 2. aufruf so korrigiere, das das Fenster Funktioniert wie angedacht und nicht "abstirbt".

Für Infos, Tips, Tricks, Anregungen etc. pp. bin ich sehr Dankbar.
Falls weitere Infos zum Source benötigt werden, zögert bitte nicht danach zu Fragen, da ich leider mit meinem Latein am Ende bin.

-- Kaffee

PS: Tut mir leid falls es aktuell nicht ganz verständlich ist, aber nach fast 18 Stunden googlen bin ich ein bissl weich in der Birne :) Zur not werd ich es morgen früh nochmal verdeutlichen.
 
Zurück