Lyn
조회 수 27384 추천 수 0 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
#include <windows.h>
#include <cstdio>
#include <cstdlib>

bool isThreadWaiting(HANDLE ThreadHandle)
{
	bool Result = false;

	SuspendThread(ThreadHandle);
	CONTEXT ThreadContext;
	ThreadContext.ContextFlags = CONTEXT_CONTROL;
	BOOL a = 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");
}


sc1.png


Wait계열 함수가 몇종류 더 있는데 그것도 그냥 각자 처리해 주면 간단...


?

List of Articles
번호 제목 글쓴이 날짜 조회 수
» 특정 Thread가 Wait계열 함수에 의해 Block 중인지 확인하기 file Lyn 2012.06.28 27384
36 [작성중] C++ 에서 Fiber 를 이용한 Coroutine 사용하기 file Lyn 2012.04.03 24897
35 [작성중] v8 스크립트 연동 file Lyn 2012.03.10 25260
34 [작성중] 알려진 포트 Lyn 2012.02.20 24739
33 C++11 lambda 간단사용법과 성능비교. 4 file Lyn 2012.01.30 32543
32 Boost 빌드 방법 1 Lyn 2012.01.14 31729
31 DLLMain에서 하지 말아야 할것. Lyn 2012.01.12 25165
30 새해다 ... Lyn 2012.01.01 28204
29 Trac, Mantis, Redmine + SVN 소스 한글 깨짐 Lyn 2011.12.20 29887
28 MultiMedia Timer 의 Timer 해상도의 비밀 file Lyn 2011.12.14 28259
27 Intel Cilk plus And SampleCode - Parallel Programming file Lyn 2011.11.23 27997
26 Visaul Studio Exception 발생시 해결방법 1 file Lyn 2011.11.10 28361
25 [Boost 살펴보기] 9. noncopyable Lyn 2011.09.15 27560
24 Mysql 툴 Lyn 2011.03.31 37563
23 [개인자료] 프로그램 만들때 무조건 해야하는것.. Lyn 2011.01.26 37246
22 사용중인 FireFox 플러그인. Lyn 2010.05.18 42484
21 Google C++ Coding Style - 번역중 Lyn 2010.03.28 39409
20 Boost 에서 자기 자신의 shared_ptr 리턴하기 file Lyn 2010.03.02 37940
19 [잡설] 앱스토어의 유행. 프로그래머에겐 과연? Lyn 2010.02.19 34433
18 [잡설]델파이 / C++ Builder 하는 사람들의 문제점. Lyn 2010.02.07 39768
Board Pagination Prev 1 ... 2 3 4 5 6 7 ... 8 Next
/ 8