Dela via


Multitrådning: Avsluta trådar i MFC

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_bAutoDelete datamedlemmen till FALSKT. Detta gör att objektet CWinThread kan överleva efter att tråden har avslutats. Du kan sedan komma åt m_hThread datamedlemmen när tråden har avslutats. Om du använder den här tekniken är du dock ansvarig för att förstöra CWinThread objektet 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_hThread datamedlem (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