Udostępnij za pośrednictwem


Wielowątkowość: Kończące wątków

Dwóch sytuacjach normalnej powodują zakończenie wątku: kończy działanie funkcji kontrolnych lub wątek nie jest dozwolone do zakończenia.Jeśli Edytor tekstów wątku dla drukowania w tle, funkcji kontroli czy zakończyć zwykle drukowania ukończone pomyślnie.Jeśli użytkownik chce anulować drukowanie, jednak wątek drukowania w tle ma być zakończony przedwcześnie.W tym temacie opisano zarówno sposób implementacji każdej sytuacji oraz uzyskać kod wyjścia wątku po zostaje zakończone.

  • Normalne zamknięcie wątku

  • Przedwczesne zakończenie wątku

  • Pobierając kod wyjścia wątku

Normalne zamknięcie wątku

Dla wątku roboczego zakończenie zwykłych wątków jest prosty: Exit kontroli funkcji i zwraca wartość, która oznacza przyczyny zakończenia.Można użyć albo AfxEndThread funkcji lub return instrukcji.Zazwyczaj 0 oznacza pomyślne zakończenie, ale która należy do Ciebie.

Dla wątku interfejsu użytkownika, proces jest tak proste: od wątku interfejsu użytkownika w ramach wywołania PostQuitMessage w Windows SDK.Jedyny parametr, PostQuitMessage odbywa się kod wyjścia wątku.Dla wątków roboczych zazwyczaj 0 oznacza pomyślne zakończenie.

Przedwczesne zakończenie wątku

Przedwczesne zakończenie wątku jest prawie tak samo proste: Call AfxEndThread od wewnątrz wątku.Przekazać kod wyjścia żądaną jako jedyny parametr.Ten zatrzymuje wykonywanie wątku, zwalnia stosu wątku, odłączenie wszystkich bibliotek DLL dołączonych do wątku i usuwa obiekt wątku z pamięci.

AfxEndThreadmusi być wywołana z poziomu wątku ma być zakończony.Zakończenie wątku z innego wątku, należy zdefiniować metodę komunikacji pomiędzy dwoma wątkami.

Pobierając kod wyjścia wątku

Aby uzyskać kod wyjścia pracownika lub wątek interfejsu użytkownika, wywołać GetExitCodeThread funkcji.Aby uzyskać informacje o tej funkcji, zobacz Windows SDK.Funkcja ta przyjmuje uchwyt do wątku (przechowywane w m_hThread członek danych z CWinThread obiektów) i adres DWORD.

Jeśli wątek jest wciąż aktywne, GetExitCodeThread miejsca STILL_ACTIVE w dostarczony DWORD adres; w przeciwnym razie kod wyjścia jest umieszczana w ten adres.

Pobierając kod wyjścia z CWinThread obiektów ma dodatkowy krok.Domyślnie gdy CWinThread wątek kończy działanie, obiekt wątku jest usuwany.Oznacza to, nie można uzyskać dostępu m_hThread Członkowskich danych ponieważ CWinThread obiekt już nie istnieje.Aby uniknąć tej sytuacji, wykonaj jedną z następujących czynności:

  • Ustaw m_bAutoDelete Członkowskich danych do FALSE.Pozwala to CWinThread obiektu do przeżycia po wątek został zakończony.Następnie można uzyskać dostęp m_hThread Członkowskich danych po wątek został zakończony.Jeśli używasz tej techniki, jednak jesteś odpowiedzialny za zniszczenie CWinThread obiektu, ponieważ w ramach nie powoduje automatycznego usunięcia go dla Ciebie.Jest to preferowana metoda.

  • Przechowywać oddzielnie uchwyt wątku.Po utworzeniu wątku, należy skopiować jego m_hThread elementu danych (za pomocą :: DuplicateHandle) do innej zmiennej i do niego dostęp za pośrednictwem tej zmiennej.W ten sposób obiekt jest automatycznie usuwany, gdy następuje zakończenie i może nadal dowiedzieć się, dlaczego wątek zakończony.Należy uważać, że wątek nie kończy się, zanim można duplikować dojścia.Najbezpieczniejszy sposób, w tym celu jest przekazanie CREATE_SUSPENDED do AfxBeginThread, zapisać uchwyt, a następnie wznowić wątek wywołując ResumeThread.

Każda metoda pozwala ustalić, dlaczego CWinThread obiektu zakończone.

Zobacz też

Informacje

_endthread, _endthreadex

_beginthread, _beginthreadex

ExitThread

Koncepcje

Wielowątkowość C++ i MFC