CoInitializeEx()

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

CoInitializeEx()

Beitrag von Krishty »

Hi,

XAudio2 verlangt von mir, dass ich CoInitializeEx() aufrufe. Dabei stehen mir verschiedene COINIT-Konstanten zur Verfügung, die ich übergeben kann/soll/muss – und ich weiß nicht, wie ich mich entscheiden soll (bei Direct3D ist man vor sowas ja wohlbehütet).

Wenn ich das richtig verstehe, sorgt COINIT_APARTMENTTHREADED dafür, dass alle Aufrufe aus verschiedenen Threads synchronisiert und seriell durch meinen Haupt-Thread verarbeitet werden. COINIT_MULTITHREADED schmeißt das alles weg und die Objekte haben selber dafür zu sorgen, dass sie bei Nebenläufigkeit nicht auf die Nase fallen. Ist damit der interne Text der COM-Objekte gemeint, oder meiner? D.h., muss ich dann die Synchronisierung selber übernehmen oder macht das die Bibliothek für mich?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: CoInitializeEx()

Beitrag von Sternmull »

Ich würd sagen deine Vorstellung von Apartment/Multi-Threaded ist korrekt. Laut Doku von CoInitializeEx gilt diese Entscheidung für alle COM-Objekte die von diesem Thread erstellt werden.

Wer da jetzt synchronisieren muss, und ob das überhaupt notwendig ist, hängt vom konkreten Fall ab. z.B. könntest du ein COM-Objekt (und alles was mit ihm interagiert) grundsätzlich immer aus einem einzigen deiner Threads aufrufen (z.B. einfach dem Main-Thread). Dann bräuchte sich keiner Sorgen um die Synchronisation machen. Vielleicht gibt es aber auch COM-Intefaces bei denen dokumentiert ist das sie sich selber synchronisieren müssen.
Gefährlich wirds wenn ein COM-Interface bzw. eine Methode davon nicht threadsicher ist (bzw. garnicht dokumentiert ist ob das Teil nun threadsafe ist... das dürfte die Regel sein). In dem Fall musst du sicherstellen das nicht mehrere Threads auf einmal drauf zugreifen.

In der Doku zu XAudio2Create wird "CoInitializeEx(NULL, COINIT_MULTITHREADED);" als typisches Beispiel genannt. Wenn du dich nicht entscheiden kannst solltest du das vielleicht einfach auch so machen :)
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: CoInitializeEx()

Beitrag von Krishty »

Dankeschön … dann werde ich auch COINIT_MULTITHREADED benutzen. Gegebenenfalls prüfe ich später nochmal, welchen Modus Direct3D 11 setzt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten