Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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:

Geschrieben
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?

Geschrieben

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.

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

Geschrieben

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

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

Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...