windows - Brug COINIT\_APARTMENTTHREADED eller COINIT\_MULTITHREADED i Media Foundation?

Indlæg af Hanne Mølgaard Plasc

Problem



I min forskning fra Media Foundation har jeg oplevet nogle tilsyneladende modstridende råd fra to meget anerkendte kilder.


Fra MSDN:
Media Foundation og COM:
https://msdn.microsoft.com/en-us/library/windows/desktop/ee892371(v=vs.85).aspx[1]



  I Media Foundation behandles asynkron behandling og tilbagekaldelse af arbejdskøer. Arbejskøer har altid multithreaded apartment (MTA) tråde, så en applikation vil få en enklere implementering, hvis den også kører på en MTA-tråd. Derfor anbefales det at ringe til CoInitializeEx med COINIT\_MULTITHREADED flag.



Derefter fra bogen 'Udvikling af Microsoft Media Foundation Applications - Af Anton Polinger' side 24:



  Bemærk MF er et trådløst system, hvilket betyder, at COM-interface-metoder kan være
  påberåbt af vilkårlig tråde. Derfor skal du initialisere, når du ringer til CoInitializeEx ()
  COM med den lejlighed-threaded objekt samtidighed ved at passere i COINIT\_
  APARTMENTREADED
parameter. Dine objekter kan muligvis også bruge synkronisering
  primitiver, såsom lås, for at kontrollere adgangen til interne variabler ved samtidig kørsel
  tråde.



Derudover har jeg set mange eksempler på Media Foundation-eksempler i GitHub, der bruger COINIT\_APARTMENTTHREADED.


Jeg udvikler en RTSP-klient, der bruger Media Foundation til at streame flere IP-kamera-feeds til Windows-skærmen. Jeg bruger flere tråde i min app, så jeg tror, ​​det vil være meget vigtigt at få et endeligt svar på dette problem. Kan nogen venligst forklare modsætningen og rådgive om den korrekte måde at fortsætte?

Bedste reference


Media Foundation har ikke brugt marshaling (det vil sige de bruger direkte kommunikation) og dens objekter bruger 'begge' lejlighedsmodellen, med fri gevindskæring på runtime.


Du er fri til at vælge lejlighedsmodellen, både MTA og STA skal træne. Arbejdstråde startet af Media Foundation vil dog altid initialiseres som MTA (specifikt fordi designen af ​​MF ikke foreslår trådjustering f.eks. På arbejdskøer, og der er ingen mening i at lave STA'er; den styrende tråd initialiseret af applikationen er okay at være STA ).


Det vil sige, at der ikke er noget galt ved at initialisere styringstråd som STA. Det har ingen indflydelse på Media Foundation API-opkald. Dokumentationen foreslår MTA-initialisering af den eneste grund, at der ikke er nogen chance for at forvirre lejlighederne ved en fejltagelse, da det er særligt nemt at forvirre lejlighederne, da API'en aktivt overfører COM-pointe mellem tråde, der ignorerer standard COM-lejlighedsregler. Hvis du forstår, at du ikke vil blive påvirket af denne adfærd, vil STA initialisering fungere godt for dig. Da du har fundet mange Media Foundation prøver, og applikationer gør STA initialisering.