^(코딩캣)^ = @"코딩"하는 고양이;

[단막 Windows API] 스레드의 생존 여부 확인하기

API/Windows API
2019. 12. 18. 22:57

단막 Windows API


스레드의 생존 여부 확인하기


본 포스팅에서는 특정 핸들(HANDLE)에 대한 스레드의 생존 여부, 다시 말해서 현재 실행중인지 종료되었는지 여부를 확인하는 방법을 정리한다.

 

GetExitCodeThread


스레드의 생존 여부를 확인할 수 있는 함수로는 GetExitCodeThread가 있다. 이 함수의 원형은 다음과 같다.

BOOL GetExitCodeThread(
    HANDLE hThread,
    LPDWORD lpExitCode
);

 

hThread는 생존 여부를 확인하고자 하는 스레드의 핸들(HANDLE)이다. lpExitCode를 통해 특정 스레드의 생존 또는 종료 코드를 얻을 수 있다.

생존 여부를 확인할 수 있으면 TRUE를 반환하고 그렇지 않으면(즉, 오류가 발생하면) FALSE를 반환한다. 이 때 오류 내용은 GetLastError 함수로 확인 가능하다.

스레드의 생존 여부를 위해 GetExitCodeThread를 호출하는 예이다.

BOOL fResult = FALSE;
DWORD dwExitCode = 0;
/* ... */
fResult = GetExitCodeThread(/* THREAD */, &dwExitCode);

 

위와 같이 호출하여 dwExitCode의 값이 STILL_ACTIVE이면 해당 스레드는 현재 실행중인 상태임을 의미한다. 해당 스레드가 종료되었다면, 종료 당시 스레드 프로시저가 리턴한 값이 보관된다. 여기서 알 수 있는 사실은, 스레드 프로시저를 작성할 때 종료 코드를 STILL_ACTIVE와 중복시키면 안 된다는 사실이다. STILL_ACTIVE의 실제 값은 정수 259이다.

 

실행 예제


static TCHAR szTextBuffer[4096];
HANDLE hThread = /* CreateThread(...) */;
DWORD dwErrorCode = 0;
/* ... */
GetExitCodeThread(hThread, &dwErrorCode);
if (dwErrorCode == STILL_ACTIVE) {
    _stprintf(szTextBuffer, TEXT("WM_USER: hThread = %08p, dwErrorCode = STILL_ACTIVE\n"), hThread);
} else {
    _stprintf(szTextBuffer, TEXT("WM_USER: hThread = %08p, dwErrorCode = %08lx\n"), hThread, dwErrorCode);
}
OutputDebugString(szTextBuffer);
/* ... */

 

버튼으로 채워진 창을 하나 열고, 이 창이 열릴 때 오랜 시간이 걸리는 작업을 수행하는 콘솔창도 하나 더 띄운다. 이 콘솔창은 스레드가 종료되면 자동으로 닫힌다. 버튼을 클릭하면 GetExitCodeThread을 실행하여 해당 스레드의 생존 여부를 디버그 출력창으로 보일 것이다.

스레드가 실행중일 때는 STILL_ACTIVE 값이 반환된다.

 

스레드가 종료되었을 때는 해당 프로시저의 리턴 값을 알 수 있다.
카테고리 “API/Windows API”
more...