오늘은 Sleep 함수에 대해 얘기하고자 합니다.
일반적인 개발언어가 다 그렇듯이 sleep 함수는 단점이 해당 프로그램이 lock이 걸린다는 점입니다.
즉, 화면이 멍해지죠.. 그래서 프로세스 부분을 Thread 로 구현해서 프로그램 안에 또 다른 프로그램이 문한루프나 sleep 을 통해 프로세스를 처리를 하고,
화면 상의 프로그램은 마우스 키보드 이벤트를 받아 처리를 하게끔 합니다.
근데 초보 프로그래머나 thread 을 사용하기에는 과도한(?) 프로그램이나... 또는 thread 안에서
큰 부하가 없이 sleep 을 사용해야 될 때가 있는데.. 이런 때 아래 함수를 이용하시면 편리합니다.
핵심은 sleep(1) 과 PeekMessage, TranslateMessage, DispatchMessage 이라고 할 수 있겠네요.
PeekMessage, TranslateMessage, DispatchMessage 이 3개의 함수는 이벤트의 펌프(?), bypasser 라고 할 수 있겠네요.
메세지큐를 강제로 읽어서 해당 이벤트를 처리하게 끔 하는 것입니다. (실질적으로 그렇게 깔끔하게 펌프 되지는 않더라구요, 그래도 없는 것보다는 낫다는..)
* 소스코드
// DWORD dwMillisecond : 밀리초
void Util::Wait(DWORD dwMillisecond)
{
MSG msg;
DWORD t0, t1, diff;
t0 = GetTickCount();
while(TRUE){
t1 = GetTickCount();
if( t0 <= t1 ) diff = t1 - t0;
else diff = 0xFFFFFFFF - t0 + t1;
if( diff > dwMillisecond ) break;
while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sleep(1);
}
}
* 사용법
Wait(3000); // 3초 sleep
사용법은 쉽습니다. 반복 프로세스가 필요한데 넣어서 사용하시면 됩니다.~
그리고, 3초라고 해서 정확한 3초는 아닐 수 있습니다. 이점 유의해서 사용해 주세요.
'프로그램 > C++' 카테고리의 다른 글
[MFC] 유니코드 멀티바이트 UTF-8 문자열 인코딩 변환 모음 (0) | 2021.01.10 |
---|---|
WM_COPYDATA 사용하기 ( OnCopyData ) (1) | 2021.01.10 |
VS2010 인텔리센스 에러 /MD _AFXDLL (0) | 2021.01.10 |
미리 컴파일된 헤더 사용시 폴더위치가 다른 곳에서 에러 안나고 쓰는 방법 (1) | 2021.01.10 |
[MFC] 유니코드 멀티바이트 UTF-8 문자열 인코딩 변환 모음 (0) | 2021.01.10 |