※ 오늘 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 |
|