Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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:

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?

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.

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.

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

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.

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

Grins Du bist ein Schatz :marine

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

Ja der Singleton funktioniert perfect. Ist nur eine COM Problem gewesen.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.