다음을 통해 공유


다중 스레딩: MFC에서 스레드 종료

두 가지 일반적인 상황으로 인해 스레드가 종료됩니다. 즉, 제어 함수가 종료되거나 스레드가 완료될 때 스레드를 실행할 수 없습니다. 워드 프로세서가 백그라운드 인쇄에 스레드를 사용하는 경우 인쇄가 성공적으로 완료되면 제어 함수가 정상적으로 종료됩니다. 그러나 사용자가 인쇄를 취소하려는 경우 백그라운드 인쇄 스레드를 조기에 종료해야 합니다. 이 항목에서는 각 상황을 구현하는 방법과 종료 후 스레드의 종료 코드를 가져오는 방법을 모두 설명합니다.

일반 스레드 종료

작업자 스레드의 경우 일반 스레드 종료는 간단합니다. 제어 함수를 종료하고 종료 이유를 나타내는 값을 반환합니다. AfxEndThread 함수 또는 return 문을 사용할 수 있습니다. 일반적으로 0은 성공적인 완료를 의미하지만 이는 사용자에게 달려 있습니다.

사용자 인터페이스 스레드의 경우 프로세스는 간단합니다. 사용자 인터페이스 스레드 내에서 Windows SDK에서 PostQuitMessage를 호출합니다. 유일한 매개 변수 PostQuitMessage 는 스레드의 종료 코드입니다. 작업자 스레드의 경우 0은 일반적으로 성공적인 완료를 의미합니다.

조기 스레드 종료

스레드를 조기에 종료하는 것은 거의 간단합니다. 스레드 내에서 AfxEndThread를 호출합니다. 원하는 종료 코드를 유일한 매개 변수로 전달합니다. 이렇게 하면 스레드 실행이 중지되고, 스레드 스택의 할당이 취소되고, 스레드에 연결된 모든 DLL이 분리되고, 메모리에서 스레드 개체가 삭제됩니다.

AfxEndThread 는 종료될 스레드 내에서 호출되어야 합니다. 다른 스레드에서 스레드를 종료하려면 두 스레드 간에 통신 방법을 설정해야 합니다.

스레드의 종료 코드 검색

작업자 또는 사용자 인터페이스 스레드의 종료 코드를 얻으려면 GetExitCodeThread 함수를 호출합니다. 이 함수에 대한 자세한 내용은 Windows SDK를 참조하세요. 이 함수는 핸들을 개체의 CWinThread 데이터 멤버에 m_hThread 저장된 스레드 및 DWORD의 주소로 이동합니다.

스레드가 여전히 활성 상태 GetExitCodeThread 이면 제공된 DWORD 주소에 STILL_ACTIVE 배치하고, 그렇지 않으면 종료 코드가 이 주소에 배치됩니다.

CWinThread 개체의 종료 코드를 검색하려면 추가 단계가 필요합니다. 기본적으로 스레드가 CWinThread 종료되면 스레드 개체가 삭제됩니다. 즉, 개체가 m_hThread 더 이상 존재하지 않으므로 데이터 멤버에 CWinThread 액세스할 수 없습니다. 이 상황을 방지하려면 다음 중 하나를 수행합니다.

  • 데이터 멤버를 m_bAutoDelete FALSE로 설정합니다. 이렇게 하면 스레드가 CWinThread 종료된 후 개체가 유지됩니다. 그런 다음 스레드가 m_hThread 종료된 후 데이터 멤버에 액세스할 수 있습니다. 그러나 이 기술을 사용하는 경우 프레임워크에서 자동으로 삭제하지 않으므로 개체를 CWinThread 삭제해야 합니다. 이는 선호되는 방법입니다.

  • 스레드의 핸들을 별도로 저장합니다. 스레드를 만든 후 데이터 멤버(사용::DuplicateHandle)를 다른 변수에 복사 m_hThread 하고 해당 변수를 통해 액세스합니다. 이렇게 하면 종료가 발생할 때 개체가 자동으로 삭제되고 스레드가 종료된 이유를 확인할 수 있습니다. 핸들을 복제하기 전에 스레드가 종료되지 않도록 주의하세요. 이 작업을 수행하는 가장 안전한 방법은 CREATE_SUSPENDED AfxBeginThread전달하고 핸들을 저장한 다음 ResumeThread를 호출하여 스레드를 다시 시작하는 것입니다.

두 방법 중 하나를 사용하면 개체가 CWinThread 종료된 이유를 확인할 수 있습니다.

참고 항목

C++ 및 MFC에서 다중 스레딩
_endthread, _endthreadex
_beginthread, _beginthreadex
ExitThread