TerminateThread 로 강제종료시킬 경우,,,
스레드가 종료작업을 모두 마친 후에 리턴되지 않고,
커널에 종료시키라는 신호만 보내고 바로 리턴하는 듯하다.(이를테면 비동기적 처리)
DWORD WINAPI ThreadFun(LPVOID lp)
{
Sleep(3000);
return 0;
}
{
DWORD tid;
HANDLE hOneThread=CreateThread(NULL, 0, ThreadFun, NULL, 0, &tid);
DWORD dwExitCode=NULL;TerminateThread(hOneThread, 0x9999);
BOOL bSuc=GetExitCodeThread(hOneThread, &dwExitCode);
char szText[256]={0};
wsprintfA(szText, "bSuc: %d, dwExitCode: 0x%x", bSuc, dwExitCode);
MessageBoxA(NULL, szText, "res", 0);
CloseHandle(hOneThread);
...
}
위와 같은 코드실행시...
dwExitCode에는 여전히 작동중(STILL_ACTIVE)이라는 값이 들어가 있었다.
중간에 아래와 같이 딜레이를 좀 줄경우
TerminateThread(hOneThread, 0x9999);
Sleep(100);
BOOL bSuc=GetExitCodeThread(hOneThread, &dwExitCode);
0x9999가 들어가거나, STATUS_THREAD_IS_TERMINATING 0xC000004B 값이 비로소 들어갔다.
스레드 생존중인지 판단할 경우 좀 유의할 필요가 있다...
이를테면 재수없게 TerminateThread로 강제종료시킬 당시에
살아있는지 판단하고자 할 경우 난감한 경우가 생길 것이다...
실제로 상당히 많은 다중스레드 작업 중에 이와 같은 경우때문에
에러가 생겼다, 안생겼다하는 젤 싫어하는 에러를 많이 봤다.
'API' 카테고리의 다른 글
멀티미디어 프로그래밍 참조 (1) | 2010.04.09 |
---|---|
midi 파일 프로그래밍 참조 (1) | 2010.04.09 |
전역 스레드 핸들을 다룰시 유의사항 (0) | 2010.03.16 |
리스트뷰(혹은 트리뷰 등등)의 배경에 그림 넣기입니다 (2) | 2009.11.05 |
[팁] 일반 윈도우에서 다이얼로그박스의 편리한 키보드 인터페이스 구현하기 (1) | 2009.10.15 |
시스템 정보 알아내기....네이버 지식인 참조 (3) | 2009.10.04 |
리스트뷰 아이템 스왑, 이동, 정렬 관련 API 소스 (2) | 2009.09.03 |