천객만래 [千客萬來] (It has an interminable succession of visitors)

[개발/MFC] Sleep()함수 대신 프로그램 딜레이 시키기 

개발을 하다가 보면... 어떤 조건이 true가 될 때까지 기다려야 할 때가 있다.
그렇게 하려면 loop를 사용해야한다. 
그리고 대기함수인 Sleep() 함수를 사용하게 되는 경우가 생기는데
이 함수를 사용하면. 모든 메세지 처리가 중단되기 때문에 
프로그램 응답 없음과 같은 애매하고 난감한 사항에 처하게 된다.
그래서 이 Sleep()이라는 함수 대신에
프로세스나 쓰레드에서 사용되는 메세지는 처리되면서 특정조건이 
만족할 때까지 기다릴 수 있는 함수가 필요하다.

대기시간 동안 메세지큐에서 메세지를 확인하여 처리하면서 
기다리게 해준다.

/////////////////////////////////////////////////////////////////
// 수행 대기 delay 함수(instead sleep function)
/////////////////////////////////////////////////////////////////
void CBaConApp::Wait(DWORD dwMillisecond)
{
 MSG msg;
 DWORD dwStart;
 dwStart = GetTickCount();

 while(GetTickCount() - dwStart < dwMillisecond)
 {
  while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }
}

Posted by SB패밀리

방법 1.
 Environment.TickCount를 사용하는 방법

        public void Delay(int ms)
        {
            int time = Environment.TickCount;

            do
            {
                if (Environment.TickCount - time >= ms)
                    return;
            } while (true);
        }

방법 2.
 DateTime 관련 함수를 이용하는 방법

public static DateTime PauseForMilliSeconds( int MilliSecondsToPauseFor )
{
    System.DateTime ThisMoment  = System.DateTime.Now;
    System.TimeSpan duration    = new System.TimeSpan( 0, 0, 0, 0, MilliSecondsToPauseFor );
    System.DateTime AfterWards  = ThisMoment.Add( duration );
   
    while ( AfterWards >= ThisMoment )
    {
            System.Windows.Forms.Application.DoEvents();
            ThisMoment = System.DateTime.Now;
    }
   
    return System.DateTime.Now;
}

방법 3.
 방법 2와 비슷하게 DateTime을 이용하여 시간 비교

private void dealTimer()
{
    DateTime dt1 = DateTime.Now;
    int diff = 0;

    while (diff < 1)
    {

        DateTime dt2 = DateTime.Now;
        TimeSpan ts = dt2.Subtract(dt1);
        diff = (int)ts.TotalSeconds;
        Application.DoEvents();

    }
}

Posted by SB패밀리