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.