Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Twee normale situaties zorgen ervoor dat een thread wordt beëindigd: de besturingsfunctie wordt afgesloten of de thread mag niet worden uitgevoerd tot voltooiing. Als een tekstverwerker een thread gebruikte voor het afdrukken op de achtergrond, zou de controlefunctie normaal beëindigen als het afdrukken succesvol is voltooid. Als de gebruiker het afdrukken wil annuleren, moet de achtergrondafdrukthread echter voortijdig worden beëindigd. In dit onderwerp wordt uitgelegd hoe u elke situatie implementeert en hoe u de afsluitcode van een thread kunt ophalen nadat deze is beëindigd.
Normale beëindiging van een thread
Voor een werkthread is normale threadbeëindiging eenvoudig: beëindig de beheerfunctie en geef een waarde terug die de reden voor beëindiging aangeeft. U kunt de functie AfxEndThread of een return instructie gebruiken. Normaal gesproken geeft 0 aan dat de voltooiing geslaagd is, maar dat is aan u.
Voor een gebruikersinterfacethread is het proces net zo eenvoudig: vanuit de gebruikersinterfacethread roept u PostQuitMessage aan in de Windows SDK. De enige parameter die PostQuitMessage neemt, is de uitvoercode van de thread. Wat betreft werkthreads geeft 0 meestal aan dat de uitvoering succesvol is.
Voortijdige beëindiging van de thread
Het voortijdig beëindigen van een thread is bijna net zo eenvoudig: AfxEndThread aanroepen vanuit de thread. Geef de gewenste afsluitcode door als de enige parameter. Hierdoor wordt de uitvoering van de thread gestopt, wordt de toewijzing van de stack van de thread ongedaan gemaakt, worden alle DLL's losgekoppeld die aan de thread zijn gekoppeld en wordt het threadobject uit het geheugen verwijderd.
AfxEndThread moet worden aangeroepen vanuit de thread die beëindigd moet worden. Als u een thread van een andere thread wilt beëindigen, moet u een communicatiemethode tussen de twee threads instellen.
De afsluitcode van een thread ophalen
Om de afsluitcode van de werkthread of de gebruikersinterface-thread te verkrijgen, roept u de functie GetExitCodeThread aan. Zie de Windows SDK voor meer informatie over deze functie. Deze functie neemt de ingang naar de thread (opgeslagen in het m_hThread gegevenslid van CWinThread objecten) en het adres van een DWORD.
Als de thread nog steeds actief is, GetExitCodeThread plaatst u STILL_ACTIVE in het opgegeven DWORD-adres. Anders wordt de afsluitcode in dit adres geplaatst.
Het ophalen van de afsluitcode van CWinThread-objecten neemt een extra stap. Wanneer een CWinThread thread wordt beëindigd, wordt het threadobject standaard verwijderd. Dit betekent dat u geen toegang hebt tot het m_hThread gegevenslid omdat het CWinThread object niet meer bestaat. Ga op een van de volgende manieren te werk om deze situatie te voorkomen:
Stel het
m_bAutoDeletegegevenslid in op FALSE. Hierdoor kan hetCWinThreadobject overleven nadat de thread is beëindigd. U kunt vervolgens toegang krijgen tot hetm_hThreadgegevenslid nadat de thread is beëindigd. Als u deze techniek echter gebruikt, bent u verantwoordelijk voor het vernietigen van hetCWinThreadobject, omdat het framework het niet automatisch voor u verwijdert. Dit is de voorkeursmethode.Sla de handle van de thread apart op. Nadat de thread is gemaakt, kopieert u het
m_hThreadgegevenslid (met behulp)::DuplicateHandlenaar een andere variabele en opent u deze via die variabele. Op deze manier wordt het object automatisch verwijderd wanneer de beëindiging plaatsvindt en kunt u nog steeds achterhalen waarom de thread is beëindigd. Pas op dat de thread niet wordt beëindigd voordat u de handle kunt dupliceren. De veiligste manier om dit te doen, is door CREATE_SUSPENDED door te geven aan AfxBeginThread, de ingang op te slaan en de thread vervolgens te hervatten door ResumeThread aan te roepen.
Met beide methoden kunt u bepalen waarom een CWinThread object is beëindigd.
Zie ook
Multithreading met C++ en MFC
_endthread, _endthreadex
_beginthread, _beginthreadex
ExitThread