보통 쓰레드 루핑에서는 CPU를 점유하지 않기 위해,
Sleep(...) 을 주어 CPU가 Context switch를 알아서 할 수 있도록 합니다.
Sleep(...) 을 주는 것은 일반적으로 알려진 좋은 방법입니다.
그런데 조금 더 효과적인 방법은 WaitForSingleObject 함수를 쓰는 것입니다.
정확하게 얼마나 더 좋은지는 저도 사실 모릅니다만,
이 함수는 API 에서 처리하는 것이므로 OS에서 가장 자원을 효과적으로
쓸수 있게 되어 있을 것으로 생각됩니다.
보통 WaitForSingleObject 는 자원을 소모하지 않고 어떤 일에 대한 결과를 기다리는데
사용되어지며 그런 목적에 가장 알맞다고 알려져 있기 때문입니다.
아래는 소스 중 일부입니다.
void __fastcall Execute()
{
Client->Connect();
DWORD start = GetTickCount();
while (!Terminated)
{
//Sleep(40);
WaitForSingleObject((void *)Handle, 40); // 요렇게 기다리는게 더 좋습니다.
if (GetTickCount() - start > 5000)
{
break;
}
}
if (Client->Connected())
{
Client->Disconnect();
}
}
|
pc에 따라 엄청 자원을 먹어서... 삽질끝에 WaitForSingleObject로 해결했던 기억이 있네요
근데 ..WaitForSingleObject 는 여러가지 목적으로 쓰이던데...
어떤 process 실행해 놓고 종료를 기다릴때
또는 세마포어 나 뮤텍스를 이용한 동기화등...
함수에 대한 좀더 깊이 알고싶습니다.
좀 가르쳐 줄수 없을까요?