Hantera trådreferenser
Den här artikeln innehåller information om hanteringen av trådreferenser med hjälp av funktioner från shell lightweight-verktygsfunktionerna.
Situationer uppstår när en föräldratråd måste hållas aktiv under hela livslängden av en barntråd. Om till exempel ett COM-objekt (Component Object Model) skapas i den överordnade tråden och konverteras till den underordnade tråden kan den överordnade tråden inte avslutas före den underordnade tråden. För att åstadkomma detta tillhandahåller Shell dessa funktioner.
Använd dessa funktioner i den överordnade tråden enligt beskrivningen här.
Deklarera en programdefinierad trådprocedur i form av funktionen ThreadProc.
DWORD WINAPI ThreadProc(LPVOID lpParameter);
I ThreadProc-anropar du SHCreateThreadRef för att skapa en referens till tråden. Detta ger en pekare till en instans av IUnknown. Den här IUnknown- använder värdet som pekas på av pcRef- för att upprätthålla ett referensantal. Så länge det här antalet är större än 0 förblir tråden aktiv.
Använd den pekaren för att IUnknownanropar du SHSetThreadRef i din ThreadProc-. Detta anger referensen, så att efterföljande anrop till SHGetThreadRef har något att hämta.
Om ThreadProc- skapar en annan tråd kan trådens ThreadProc- anropa SHGetThreadRef med pekaren till IUnknown som hämtats av SHCreateThreadRef. Detta ökar referensantalet som pekas på av parametern pcRef i SHCreateThreadRef.
Skapa tråden. Detta görs vanligtvis genom att anropa SHCreateThreadoch skicka en pekare till ThreadProc- i parametern pfnThreadProc. Skicka också flaggan CTF_THREAD_REF i parametern dwFlags. Tråden är aktiv så länge ThreadProc- körs.
När en underordnad tråd skapas skickar du flaggan CTF_REF_COUNTED i parametern dwFlags i anropet till dess SHCreateThread.
När underordnade trådar slutförs och frigörs, minskar det värde som pekas ut av den överordnade trådens pcRef. När alla underordnade trådar har avslutats kan den ursprungliga ThreadProc- avsluta och släppa den sista trådreferensen, och minska referensantalet till 0. Då släpps referensen till den ursprungliga tråden som öppnades av SHCreateThread och tråden slutförs.
En annan relaterad funktion är SHReleaseThreadRef. Den här funktionen anropas av ThreadProc- om tråden har skapats med hjälp av SHCreateThread med flaggan CTF_THREAD_REF. Men ThreadProc behöver inte göra det implicit. Att anropa IUnknown::Release på pekaren till IUnknown erhållen genom SHCreateThreadRef är allt som behöver göras.