Sdílet prostřednictvím


Multithreading: Ukončení podprocesů

Dva obvyklé situace způsobit na ukončení podprocesu: ukončí řídící funkce nebo není povoleno spuštění a ukončení podprocesu.Pokud textový procesor používá vlákno pro tisk na pozadí, řídící funkce by jej měla ukončit normálně, jestliže je tisk úspěšně dokončen.Pokud chce však uživatel zrušit tisk, vlákno tisku na pozadí musí být předčasně ukončeno.Toto téma vysvětluje, jak implementovat obě situace a jak získat ukončovací kód vlákna poté, co je ukončeno.

  • Normální ukončení vlákna

  • Předčasné ukončení vlákna

  • Získání ukončovacího kódu vlákna

Normální ukončení vlákna

Ukončení podprocesu normální pracovní podproces je jednoduchý: ukončení funkce řízení a vrátí hodnotu, která označuje důvod ukončení.Můžete použít buď funkci AfxEndThread nebo příkaz return.Obvykle 0 znamená úspěšné dokončení, ale je to na vás.

Proces uživatelského rozhraní podprocesu je stejně jednoduché: z podproces uživatelského rozhraní ve volání PostQuitMessage v Windows SDK.Jediným parametrem PostQuitMessage je ukončovací kód vlákna.Stejně jako u pracovních vláken 0 obvykle znamená úspěšné dokončení.

Předčasné ukončení vlákna

Předčasné ukončení podprocesu je téměř jednoduchý: volání AfxEndThread z podprocesu, v rámci.Předejte požadovaný ukončovací kód jako jediný parametr.To zastaví provádění vlákna, zruší přidělení zásobníku vlákna, odpojí všechny k vláknu připojené knihovny DLL a odstraní objekt vlákna z paměťi.

Aby bylo vlákno ukončeno, AfxEndThread musí být volána prostřednictvím vlákna.Pokud chcete ukončit vlákno z jiného vlákna, musíte nastavit metodu komunikace mezi dvěma vlákny.

Získání ukončovacího kódu vlákna

Chcete-li získat ukončovací kód pracovního vlákna nebo vlákna uživatelského rozhraní, zavolejte funkci GetExitCodeThread.Další informace o této funkci naleznete v tématu Windows SDK.Tato funkce příjmá zpracovávané vlákno (uložené v datovém členu m_hThread objektů CWinThread) a adresu DWORD.

Pokud je vlákno stále aktivní, GetExitCodeThread umístí STILL_ACTIVE do zadané adresy DWORD; v opačném případě zde umístí ukončovací kód.

K získání ukončovacího kódu objektu CWinThread potřebuje ještě jeden krok navíc.Jako výchozí je při ukončení vlákna CWinThread objekt vlákna odstraněn.To znamená, že nebudete mít přístup k datovému členu m_hThread, protože objekt CWinThread již neexistuje.Aby k této situaci nedošlo, proveďte jeden z následujících pokynů:

  • Nastavte datový člen m_bAutoDelete na hodnotu FALSE.To umožňuje, aby byl objekt CWinThread zachován poté, co je vlákno ukončeno.Poté, co bylo vlákno ukončeno, můžete tak nadále přistupovat k datovému členu m_hThread.Pokud použijete tento postup, zodpovídáte však za zrušení objektu CWinThread, protože akrchitektura jej neodstraní automaticky.Tohle je upřednostňovaná metoda.

  • Uložte popisovač vlákna zvlášť.Potom, co je vlákno vytvořeno, zkopírujte jeho datový člen m_hThread (pomocí :: DuplicateHandle) do jiné proměnné a přístupujte k němu prostřednictvím dané proměnné.Tímto způsobem bude objekt automaticky odstraněn, pokud dojde k ukončení a můžete stále zjistit, proč bylo vlákno ukončeno.Dbejte na to, že vlákno neskončí dříve, než duplikujete popisovač.Nejbezpečnější způsob, jak to provést, je předat CREATE_SUSPENDED do AfxBeginThread, uložit popisovač a poté obnovit vlákno voláním ResumeThread.

Obě metody umožňují určit, proč byl ukončen objekt CWinThread.

Viz také

Referenční dokumentace

_endthread _endthreadex

_beginthread _beginthreadex vrací

ExitThread

Koncepty

Multithreading s C++ a MFC