Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Två normala situationer gör att en tråd avslutas: den kontrollerande funktionen avslutas eller tråden får inte köras till slutförande. Om en ordbehandlare använde en tråd för bakgrundsutskrift skulle den kontrollerande funktionen avslutas normalt om utskriften har slutförts. Om användaren vill avbryta utskriften måste dock bakgrundsutskriftstråden avslutas i förtid. Det här avsnittet beskriver både hur du implementerar varje situation och hur du hämtar slutkoden för en tråd när den har avslutats.
Normal trådavslutning
För en arbetstråd är normal trådavslutning enkel: Avsluta den kontrollerande funktionen och returnera ett värde som anger orsaken till avslutningen. Du kan använda funktionen AfxEndThread eller en return instruktion. Normalt innebär 0 att slutförandet är slutfört, men det är upp till dig.
För en användargränssnittstråd är processen lika enkel: från användargränssnittstråden anropar du PostQuitMessage i Windows SDK. Den enda parametern som PostQuitMessage tar är trådens slutkod. När det gäller arbetstrådar innebär 0 vanligtvis lyckat slutförande.
För tidig trådavslutning
Det är nästan lika enkelt att avsluta en tråd i förtid: Anropa AfxEndThread inifrån tråden. Ange önskad utgångskod som den enda parametern. Detta stoppar körningen av tråden, frigör trådens stack, kopplar bort alla DLL:er som är kopplade till tråden och tar bort trådobjektet från minnet.
AfxEndThread måste anropas inifrån tråden för att avslutas. Om du vill avsluta en tråd från en annan tråd måste du konfigurera en kommunikationsmetod mellan de två trådarna.
Hämtar slutkoden för en tråd
Om du vill hämta slutkoden för antingen arbetaren eller användargränssnittstråden anropar du funktionen GetExitCodeThread . Information om den här funktionen finns i Windows SDK. Den här funktionen tar handtaget till tråden (lagras i objektens m_hThreadCWinThread datamedlem) och adressen till en DWORD.
Om tråden fortfarande är aktiv GetExitCodeThread placeras STILL_ACTIVE i den angivna DWORD-adressen. Annars placeras slutkoden i den här adressen.
Att hämta slutkoden för CWinThread-objekt tar ett extra steg. Som standard tas trådobjektet bort när en CWinThread tråd avslutas. Det innebär att du inte kan komma åt m_hThread datamedlemmen eftersom objektet CWinThread inte längre finns. Gör något av följande för att undvika den här situationen:
Ange
m_bAutoDeletedatamedlemmen till FALSKT. Detta gör att objektetCWinThreadkan överleva efter att tråden har avslutats. Du kan sedan komma åtm_hThreaddatamedlemmen när tråden har avslutats. Om du använder den här tekniken är du dock ansvarig för att förstöraCWinThreadobjektet eftersom ramverket inte tar bort det automatiskt åt dig. Det här är den metod som föredras.Lagra trådens handtag separat. När tråden har skapats kopierar du dess
m_hThreaddatamedlem (med hjälp av::DuplicateHandle) till en annan variabel och kommer åt den via den variabeln. På så sätt tas objektet bort automatiskt när avslutningen sker och du kan fortfarande ta reda på varför tråden avslutades. Var försiktig så att tråden inte avslutas innan du kan duplicera handtaget. Det säkraste sättet att göra detta är att skicka CREATE_SUSPENDED till AfxBeginThread, lagra handtaget och sedan återuppta tråden genom att anropa ResumeThread.
Med någon av metoderna kan du avgöra varför ett CWinThread objekt avslutades.
Se även
Multitrådning med C++ och MFC
_endthread, _endthreadex
_beginthread, _beginthreadex
AvslutaTråd