Threadverwijzingen beheren
Dit artikel bevat informatie over het beheer van threadverwijzingen met behulp van functies van de Shell lightweight-hulpprogrammafuncties.
Er zijn situaties waarin een ouder-thread actief moet blijven gedurende de levensduur van een kind-thread. Als er bijvoorbeeld een COM-object (Component Object Model) wordt gemaakt op de bovenliggende thread en in de onderliggende thread wordt geplaatst, kan die bovenliggende thread niet worden beëindigd vóór de onderliggende thread. Hiervoor biedt de Shell deze functies.
Gebruik deze functies in uw hoofdthread, zoals hier wordt beschreven.
Declareer een door de toepassing gedefinieerde threadprocedure volgens de vorm van de functie ThreadProc.
DWORD WINAPI ThreadProc(LPVOID lpParameter);
Roep in uw ThreadProc-SHCreateThreadRef- aan om een verwijzing naar de thread aan te maken. Dit biedt een verwijzing naar een instantie van IUnknown. Deze IUnknown- gebruikt de waarde waarnaar wordt verwezen door pcRef- om een referentieaantal te behouden. Zolang dit aantal groter is dan 0, blijft de thread actief.
Als u deze aanwijzer gebruikt om IUnknown-aan te roepen, roept u SHSetThreadRef- aan in uw ThreadProc-. Hiermee stelt u de verwijzing zo in dat volgende aanroepen naar SHGetThreadRef- iets hebben om op te halen.
Als uw ThreadProc een andere thread maakt, kan de ThreadProc-SHGetThreadRef aanroepen met de aanwijzer om IUnknown- verkregen door SHCreateThreadRef-. Hiermee wordt het verwijzingsaantal verhoogd waarnaar wordt verwezen door de parameter pcRef in SHCreateThreadRef-.
Maak de thread. Dit wordt meestal gedaan door SHCreateThreadaan te roepen en een aanwijzer door te geven aan uw ThreadProc in de pfnThreadProc parameter. Geef ook de vlag CTF_THREAD_REF door in de parameter dwFlags. De thread is actief zolang ThreadProc- wordt uitgevoerd.
Wanneer een onderliggende thread wordt gemaakt, geeft u de vlag CTF_REF_COUNTED door in de parameter dwFlags in de aanroep naar de SHCreateThread-.
Als kindthreads zijn voltooid en worden vrijgegeven, neemt de waarde waarnaar wordt verwezen door de pcRef- van de bovenliggende thread af. Zodra alle onderliggende threads zijn voltooid, kan de oorspronkelijke ThreadProc het proces voltooien en de laatste threadreferentie vrijgeven, waarmee het aantal verwijzingen tot 0 wordt teruggebracht. Op dat moment wordt de verwijzing naar de oorspronkelijke thread die is geopend door SHCreateThread- vrijgegeven en is de thread voltooid.
Een andere gerelateerde functie is SHReleaseThreadRef. Deze functie wordt aangeroepen door de ThreadProc- als de thread is gemaakt met SHCreateThread- met de vlag CTF_THREAD_REF. De ThreadProc- hoeft dit echter niet impliciet te doen. Het aanroepen van IUnknown::Release op de aanwijzer naar IUnknown verkregen via SHCreateThreadRef is alles wat moet worden gedaan.