본문 바로가기

MS/C++

특정 Thread가 종료 되었는지 대기중인지 알수 있는 코드

출 : http://lunapiece.net/Article/879327



#include <windows.h>
#include <cstdio>
#include <cstdlib>
 
bool isThreadWaiting(HANDLE ThreadHandle)
{
    bool Result = false;
 
    SuspendThread(ThreadHandle);
    CONTEXT ThreadContext;
    ThreadContext.ContextFlags = CONTEXT_CONTROL;
    GetThreadContext(ThreadHandle, &ThreadContext);
    INT_PTR* StackPointer = reinterpret_cast<INT_PTR*>(ThreadContext.Esp);
 
    HMODULE DLLHandle = LoadLibraryA("Ntdll.dll");
    INT_PTR WaitFunctionPtr = reinterpret_cast<INT_PTR>(GetProcAddress(DLLHandle, "NtWaitForSingleObject"));
    //WaitForSingleObject의 종착점이 되는 함수가 NtWaitForSingleObject
     
    if ((*StackPointer >= WaitFunctionPtr) && (*StackPointer <= WaitFunctionPtr + 50))
    {
        //대충 +50을 해 주는 이유는 실제 복귀주소로 저장된 곳이 NtWaitForSingleObject의 시작주소가 아니라 조금 실행된 뒤이기 때문
        Result = true;     
    }
 
    FreeLibrary(DLLHandle);
    ResumeThread(ThreadHandle);
 
    return Result;
}
 
DWORD PASCAL ThreadFun1(PVOID Param)
{
    WaitForSingleObject(HANDLE(Param), INFINITE);
 
    return 0;
}
 
DWORD PASCAL ThreadFun2(PVOID Param)
{
    while(true)
    {
        Sleep(100000);
    }
 
    return 0;
}
void main()
{  
    HANDLE Event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
 
    HANDLE Thread1 = CreateThread(nullptr, 0, &ThreadFun1, reinterpret_cast<LPDWORD>(Event), 0, nullptr);
    HANDLE Thread2 = CreateThread(nullptr, 0, &ThreadFun2, nullptr, 0, nullptr);
 
    Sleep(1000); //Thread 돌 시간좀 주고 ...
 
    printf("Is Thread1 Waiting? %s\n", isThreadWaiting(Thread1) ? "Yes" : "No");
    printf("Is Thread2 Waiting? %s\n", isThreadWaiting(Thread2) ? "Yes" : "No");
 
    system("pause");
}




'MS > C++' 카테고리의 다른 글

curl - setopt 종류  (0) 2013.03.18
CTreeCtrl  (0) 2013.03.11
보호된 프로세스로 설정하기  (0) 2013.02.14
멀티바이트 --> 유니코드 (매크로)  (0) 2012.11.20
boost library 설치 방법  (0) 2012.08.10
OpenMP  (0) 2012.07.23
ms에서 dirent.h파일 사용 하기  (0) 2012.06.08
SetThreadAffinityMask : 멀티 쓰레드 프로그래밍 기본  (0) 2012.05.23
ActiveX 제작시 Visat/Win7에서 주의해야 할 사항  (0) 2011.11.18
gsoap  (0) 2011.11.08