Szálhivatkozások kezelése
Ez a cikk a shell egyszerűsített segédprogramfüggvényeiből származó függvényeket használó szálhivatkozások kezelésével kapcsolatos információkat tartalmaz.
Olyan helyzetek merülnek fel, amikor a szülőszálat a gyermekszál teljes élettartama alatt aktívnak kell tartani. Ha például a szülőszálon létrejön egy COM-objektum, és azt átküldik a gyermekszálra, akkor a szülőszál nem állítható le a gyermekszál előtt. Ehhez a Shell biztosítja ezeket a funkciókat.
Az alábbi függvényeket az alábbiak szerint használja a szülőszálban.
Deklarál egy alkalmazás által definiált szál eljárást a ThreadProc függvény formáját követve.
DWORD WINAPI ThreadProc(LPVOID lpParameter);
A ThreadProcmeghívja SHCreateThreadRef a szálra mutató hivatkozás létrehozásához. Ez egy mutatót biztosít az IUnknownegy példányára. Ez a IUnknown a hivatkozásszám fenntartásához a pcRef által mutatott értéket használja. Amíg ez a szám 0-nál nagyobb, a szál aktív marad.
Ezzel a mutatóval IUnknown, hívja meg SHSetThreadRef a ThreadProc. Ezzel beállítja a hivatkozást, hogy a SHGetThreadRef későbbi hívásai tudjanak mit lekérni.
Ha a ThreadProc létrehoz egy másik szálat, akkor annak a szálnak a ThreadProc meghívhatja a SHGetThreadRef függvényt a SHCreateThreadRefáltal beszerzett IUnknown mutatójával. Ez növeli a hivatkozásszámot, amelyre a pcRef paraméter mutat a SHCreateThreadRef-ben.
Hozzon létre szálat. Ez általában úgy történik, hogy meghívja SHCreateThread, majd a pfnThreadProc paraméterben egy mutatót ad át a ThreadProc. Adja meg a CTF_THREAD_REF jelzőt is a dwFlags paraméterben. A szál addig aktív, amíg ThreadProc fut.
Alfolyamat létrehozásakor adja át a CTF_REF_COUNTED jelzőt a dwFlags paraméterben az SHCreateThreadhívásakor.
Ahogy a gyermekszálak befejeződnek és felszabadulnak, a szülőszál pcRef által mutatott érték csökken. Miután az összes gyermekszál elkészült, az eredeti ThreadProc befejezheti és felszabadíthatja a végső szálhivatkozást, így a hivatkozásszám 0-ra csökken. Ezen a ponton a SHCreateThread által megnyitott eredeti szálra mutató hivatkozás ki lesz adva, és a szál befejeződött.
Egy másik kapcsolódó függvény az SHReleaseThreadRef. Ezt a függvényt a ThreadProc hívja meg, ha a szál SHCreateThread használatával lett létrehozva a CTF_THREAD_REF jelzővel. Azonban a ThreadProc számára nem kötelező ezt implicit módon elvégezni. A SHCreateThreadRef segítségével beszerzett mutató IUnknown esetén a IUnknown::Release meghívása az egyetlen szükséges teendő.