Babybaer Geschrieben 23. September 2003 Geschrieben 23. September 2003 Hallo Leutz, meine Entwicklungsumgebung : VS.Net C++ 2002 Mein Problem besteht darin einen Thread zu erzeugen der aber auf einen Singleton- Instance zugreifen muss, diese aber in einen anderen Namespace liegt . Leider bekomme ich das nicht ganz in den Griff. Habe da was gehört das es einen Threadsingleton geben soll. Wo oder wer kann mir da helfen. Auch andere Lösungen nehme ich mir gern zu Herzen. Danke schon mal :floet: Zitieren
Klotzkopp Geschrieben 23. September 2003 Geschrieben 23. September 2003 Original geschrieben von Babybaer Mein Problem besteht darin einen Thread zu erzeugen der aber auf einen Singleton- Instance zugreifen muss, diese aber in einen anderen Namespace liegt . Ehrlich gesagt, ich verstehe nicht, was du willst. Ich wüsste nicht, warum der Zugriff auf ein Singleton vom Threadkontext abhängen sollte, und was das mit Namespaces zu tun hat. Kannst du das etwas genauer erläutern oder ein Minimal-Codebeispiel posten? Zitieren
Babybaer Geschrieben 23. September 2003 Autor Geschrieben 23. September 2003 Einfacher gesagt. Ich habe mehre Klassen die eine und die selbe Instance ein Singelton Klasse verwenden müssen. Wenn ich das richtig verstanden habe: wenn ich einen Thread erzeuge, bekommt dieser Thread einen anderen Adressraum. Kann das heißen wenn ich auf meine Singeltonklasse zugreife bekomme ich eine neue Instance oder zumindest eine leere Instance mit einer anderen Speicheradresse? DWORD WINAPI FormatThread(LPVOID pParam) { CClose * cc = new CClose; cc->getInstance()->OnClose(OPEN); CFormat format; format.Format(CClose ::getInstance(),false,false,NULL); cc->getInstance()->OnClose (CLOSE); cc->deleteInstance(); delete cc; return 0; } ____________ CFormat: LONG CFormat::Format(CClose * hInstance, BOOL bFormatart, BOOL bOpenRecorder, LPCTSTR csDevice) { HRESULT hr; while(1) { //hier is nix mehr mir der Instance !!!!!!!! hr = hInstance->OnSelectBrenner(csDevice); if(hr == S_OK) hr = hInstance->OnCloseEx(OPEN); else break; ... } ------------ Nun ja ich kann eine Instance erzeugen aber in der Formatmethode ist sie weg!!! Vielleicht drücke ich mich etwas falsch aus, aber mir fährt die Anwendung da an die Wand weil die Instance nicht mehr vorhanden ist. Zitieren
Klotzkopp Geschrieben 23. September 2003 Geschrieben 23. September 2003 Original geschrieben von Babybaer Ich habe mehre Klassen die eine und die selbe Instance ein Singelton Klasse verwenden müssen. Wenn ich das richtig verstanden habe: wenn ich einen Thread erzeuge, bekommt dieser Thread einen anderen Adressraum.Nein, alle Threads eines Prozesses teilen sich den Adressraum. CClose * cc = new CClose; cc->getInstance()->OnClose(OPEN); Ich denke, hier ist das Problem. CClose::getInstance ist statisch (sonst könntest du es im Format-Aufruf nicht so benutzen). Es macht also hier keinen Sinn, eine neue Instanz von CClose zu erstellen. Das widerspricht ja auch dem Sinn eines Singleton. Üblicherweise sind Singletons so implementiert, dass getInstance die Singleton-Instanz erstellt, wenn das noch nicht passiert ist, ansonsten wird einfach ein Zeiger oder eine Referenz auf die Instanz zurückgegeben. Du brauchst also kein CClose-Objekt anzulegen. Zitieren
Babybaer Geschrieben 23. September 2003 Autor Geschrieben 23. September 2003 OK ich habe in der (Singelton) COpen Klasse noch andere Methoden die ich nutzen möchte sollte die Singelton nur für die Instance zuständig sein? Dann sollte ich COpen das tun lassen was es machen sollte und die Instance in einer neuen Singleton Klasse erzeugen. Ich werde es gleich mal testen. cc->getInstance()->OnClose(OPEN); zerstört nicht die Instance sonder erzeugt von einer anderen anderen Klasse ein Objekt ... Zitieren
Klotzkopp Geschrieben 23. September 2003 Geschrieben 23. September 2003 Original geschrieben von Babybaer OK ich habe in der (Singelton) COpen Klasse noch andere Methoden die ich nutzen möchte sollte die Singelton nur für die Instance zuständig sein?Nein, das ist kein Problem, nur solltest du diese Methoden ausschließlich über CClose::getInstance()->MethodenName() aufrufen. Zur Sicherheit empfehle ich, den CTor private zu machen, damit die nur die Klasse selbst in der statischen Methode die Instanz erstellen kann. Zitieren
Babybaer Geschrieben 26. September 2003 Autor Geschrieben 26. September 2003 Also das funktioniert so nicht. Ich kann in dem Thread alles mögliche ausführen, nur wenn ich diese ein Klasse benutzen will, bekomme ich als Returnwert: CoInitialize wurde nicht aufgerufen. Muss ich mit COM-Klassen etwas bei Thread´s beachten? Vielleicht liegt es ja auch daran? Das Ziel ist es mit der Hilfe der IMAPI eine CRRW zu formatieren (bis hier hin tut ja alles) nun möchte ich noch eine Fortschrittsanzeige dafür haben. Das heißt ich muss den ganzen Prozess in einen Thread packen und eine Pointer auf den Fortschrittwert bekommen. Hat jemand eine Idee wie das funktioniert? Danke Zitieren
Klotzkopp Geschrieben 26. September 2003 Geschrieben 26. September 2003 Original geschrieben von Babybaer Muss ich mit COM-Klassen etwas bei Thread´s beachten?Ja. CoInitialize (bzw. CoInitializeEx) muss für jeden Thread, der COM benutzen will, aufgerufen werden. Zitieren
Babybaer Geschrieben 26. September 2003 Autor Geschrieben 26. September 2003 Grins Du bist ein Schatz :marine Zitieren
Knuddlbaer Geschrieben 29. September 2003 Geschrieben 29. September 2003 Denk aber auch bei Multithreading daran das der Singleton im falle eines Schreibzugriffes geschützt sein muß. A liest 1 ein B schreibt 2 zurück A addiert n zu 1 A schreibt 1+n zurück B geht nun davon aus das 2 drinnsteht, es steht aber in wirklichkeit 1+n drinn Zitieren
Babybaer Geschrieben 29. September 2003 Autor Geschrieben 29. September 2003 Ja der Singleton funktioniert perfect. Ist nur eine COM Problem gewesen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.