프로그램/C++

Sleep 을 대신할 수 있는 Wait 함수

네오류이 2021. 1. 10. 13:03
728x90
반응형

오늘은 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초는 아닐 수 있습니다. 이점 유의해서 사용해 주세요.

 

 

728x90
반응형