Dialog von mehreren Threads aufrufen lassen
-
Bekanntermassen gehört zu einem Dialog immer ein Thread.
Wie stelle ich es an, dass ich von mehreren Threads aus Zugriff auf den einen Dialog habe?
-
Auf was willst Du zugreifen?
1. Ein Dialog wird von einem Thread erzeugt.
2. Das Handle kannst Du in jedem anderen Thread verwenden und Nachricten senden.BTW: CWnd* nicht verwenden außer es geht um reinen Zugriff auf Datenmember.
Auf Thread-Synchronisation und Synchronisation beim Zugriff auf die Daten musst Du selber achten.
-
Also habe mir das folgendermassen vorgestellt.
Ein Interface dem man eine ID übergibt. Anhand dieser ID wird ein bestimmter Dialog erzeugt. Über dieses Interface und der ID soll der gewünschte Dialog von jedem beliebigen Thread aus angesprochen (Dialog anzeigen, Nachrichten an Dialog senden, Dialog schliessen) werden können.
-
Also ich lege bisher meinen Dialog wie folgt an:
m_pdlgMy = new CMyDlg(); m_pdlgMy->Create(IDD_DIALOG_MY);
Woher bekomme ich dazu nun ein Handle?
-
m_pdlgMy->GetSafeHWnd();
-
Ok. Erstes Problem gelöst. Danke.
Wie sieht es aus wenn ich meinem Interface nur die ID übergebe: Also IDD_DIALOG_MY.
Kann ich anhand dieser ID erkennen welcher Dialog ihr zugeordnet ist. Und davon dann ein neues Objekt anlegen?
-
Nein! Man kann Anhand der Ressourcen ID nicht erkennen welcher Dialog läuft. Es gibt zwar ein paar interne Variablen im CDialog aber sinnreich ist das nicht. Vor allem müsstest Du dazu erstmal wieder alle Deine Dialoge enumerieren.
Bau Dir doch eine Factory Klasse...
-
Factory Klasse...
Dachte halt ich schaff es die Klasse so zu gestallten, dass wenn ein neuer Dialog kommt ich nichts weiter anpassen muss. Nur eine Funktion aufrufen aus meinem Interface. So muss ich halt nun immer die Factory Klasse zusätzlich erweitern
-
Naja. Wenn Du den Dialog immer von einer eigenen Basisklasse ableitest, die eine interne Liste der erzeugten Objekte verwaltet, dann hast Du keinen Aufwand.
Du könntest das sogar mit den Funktionen für das dynmaische Erzeugen (IMPLEMENT_/DECLARE_DYNCREATE) verbinden.
-
Das habe ich jetzt nicht verstanden wie du das meinst.
-
1. In einer Basisklasse von CDialog, die Du wieder als Baisklasse für Deine Dialoge benutzt kannst Du doch eine statische Liste befüllen, die alle existierende Objekte umfasst.
2. Via RUNTIME_CLASS kann man auch Objekte gezielt erzeugen. Eine Factory ist dann unnötig, denn CObject stellt ja genau in dem Sinne eine Factory zur Verfügung.
-
In einer Basisklasse von CDialog...
Du meinst in einer abgeleiteten Klasse von CDialog oder?
doch eine statische Liste befüllen, die alle existierende Objekte umfasst.
Versteh ich immer noch nicht. Es existieren doch keine Objekte zu begin.
Ich übergebe meinem Interface eine ID und anhand dieser ID wird nun ein Objekt erzeugt. Sei es nun mit switch case oder RUNTIME_CLASS (wobei ich aich noch nicht weiß wie das geht). Nun speichere ich die ID und das Handle des erzeugten Dialogs in einer map ab. Nun habe ich mit der ID über das Interface Zugriff auf den Dialog.
Für was benötige ich nun eine Basisklasse und für was eine statische Liste?
Und wie geht das mit RUNTIME_CLASS?
-
push