배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   DelayTime()함수, WaitSeconds()함수, Sleep()함수, GetTickCount함수
제목:   잠시 기다려 주세요!
     
 

새 페이지 1

  STEP> 따라하기
 

※ 오늘 Daily Tip은 곽승주님이 제공해주신 내용입니다.

PC의 가장 큰 미덕 중 하나는 빠르다는 것입니다. 분명 예전보다 빠른 컴퓨팅
의 시대에 살고 있지만 우리는 PC가 빠르다는 것을 오래 체감하진 못합니다. 새로운 PC를 사거나 업그레이드를 하거나 새로 OS를 막 설치했을 때 느끼려나... 그런데 프로그래밍의 경우 종종 "빨리 빨리"가 아닌 잠깐 멈추고 싶은 경우가 생기죠 그래서 종종 몇 초를 멈추었다가 다시 시작하는 방법을 묻는 질문이 있습니다

그래서 생각하는 꼼수 중 하나는 수 십만 법을  헛 루프 돌리는 것입니다. For~Next Do~Loop를 사용하여 아무 하는 일 없이 수 십 만법 돌리도록 하는 것입니다. 그러나 이런 경우 성능이 좋은 PC와 그렇지 않은 PC간에 차이가 생길 겁니다. 성능이 좋아 수 십만 법의 루프를 10초 내 끝내는데, 성능이 떨어지는 PC는 몇 10분 정도 걸리는 수가 있습니다. 그래서 오늘은 몇 가지의 시간지연함수를 소개하고자 합니다

<1> DelayTime()함수

다음의 DelayTime()함수시작시점을 Timer함수로 얻어오고 여기에 원하는 시간을 더해 루프를 돌 때 마다 확인합니다. 물론 Do~Loop를 반복하는 동안 DoEvents를 사용하여 CPU를 독점하여 사용하지 않도록 합니다.

Sub DelayTime(PauseTime As Single)
    Dim start      As Single   

    start = Timer
    Do While Timer < start + PauseTime
        DoEvents
    Loop

End Sub

<2> WaitSeconds()함수

다음은 더 간단하게 한 줄로 끝내는 함수입니다. 아래의 WaitSeconds()함수 Application개체의 Wait메소드를 사용합니다.

[Wait메소드에 대한 도움말]

지정한 시간 동안 실행 중인 매크로를 잠시 중지합니다. 지정한 시간이 되면 True를 반환합니다.

*중요*
Wait 메소드는 모든 작업을 일시 중지하여 Wait가 영향을 주는 동안 다른 작업을 실행할 수 없게 합니다. 그러나 인쇄나 재계산과 같은 백그라운드 작업은 계속할 수 있습니다.

Wait메소드 다음에 언제까지 중단할지를 지정합니다. 그래서 "Now+얼마"를 하면 지금으로부터 얼마간을 중단하게 됩니다.

Sub WaitSeconds(waitTime As Integer)
    Application.Wait (Now + TimeValue("00:00:" & Format(waitTime, "00")))

End Sub

<3> Sleep()함수

API함수를 사용하는 방법도 있습니다. Sleep()이라는 함수를 사용하는데, 매개변수로는 밀리세컨즈를 줍니다. 그러니까 우리에게 친숙한 초 단위를 밀리세컨즈로 바꾸려면 1000을 곱하면 됩니다. 가령 다음의 경우 3초를 지연시키기 위해 ‘3000'을 주었습니다.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep (3000)  '// Will pause for 3 seconds

<4> GetTickCount함수

또 다른 API함수로 GetTickCount라는 함수를 사용하기도 합니다.

Declare Function GetTickCount Lib "kernel32" () As Long 

Sub Delay(nSeconds As Long)
  Dim TimeOut As Long 

  TimeOut = (GetTickCount / 1000) + nSeconds
  Do
    DoEvents
  Loop Until TimeOut < (GetTickCount / 1000)
End Sub