기존에 사용하셨던 vb6.0 sleep은
보통 1초이상 딜레이를 주면 1초동안 살짝 순단 현상이 발생했다가 다음 동작이
진행되는걸 보실수 있을겁니다. 아니면 쓰레드를 이용해 이러한점을 보완 하신분들도 계실테지요.
다만, VB6.0 에서의 쓰레드란 살얼음판 위를 걷는것과 같아서 거의 대부분 아예 VB6.0 외의
프로그래밍 툴로 넘어가시거나 하실텐데요.
제가 오늘 소개 해드릴 sleep을 대체할수 있는 비동기식 sleep(?) 딜레이(?) 를 줄수 있는 함수를 소개해드리려 합니다.

예를들어 Winhttp 통신을 여러번 해야하는 상황이라면 초마다 통신하기엔 컴퓨터에도 그렇고
사이트상에서도 본의 아니게 트래픽을 갉아먹는 행위를 하게 됩니다.
이러한 상황 또는 반복문 내에서 약간의 딜레이를 줄때 많이들 사용 하실텐데요.
그냥 일반 do loop문을 통해 딜레이를 주게되면 단 1~2초라도 순간 cpu사용량이 엄청납니다.
아래 함수를 통하여 cpu사용량 절전과 동시에 비동기식 sleep을 통해 딜레이를 사용해 보세요.

[함수 코드]
'상단에 sleep 선언
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Function Pause( _
      ByVal Seconds As Single, _
      Optional ByVal PreventVBEvents As Boolean _
   )

'지정된 초 동안 일시 중지합니다. 초를 지정할 수 있습니다.
'1/100 초. sleep 루틴은 각주기마다 호출됩니다.
'DoEvents가 똑같이하는 동안 다른 응용 프로그램에 시간을줍니다.

   Const MaxSystemSleepInterval = 25 ' milliseconds
   Const MinSystemSleepInterval = 1 ' milliseconds
   
   Dim ResumeTime As Double
   Dim Factor As Long
   Dim SleepDuration As Double
   
   Factor = CLng(24) * 60 * 60
   
   ResumeTime = Int(Now) + (Timer + Seconds) / Factor
   
   Do
      SleepDuration = (ResumeTime - (Int(Now) + Timer / Factor)) * Factor * 1000
      If SleepDuration > MaxSystemSleepInterval Then SleepDuration = MaxSystemSleepInterval
      If SleepDuration < MinSystemSleepInterval Then SleepDuration = MinSystemSleepInterval
      Sleep SleepDuration
      If Not PreventVBEvents Then DoEvents
   Loop Until Int(Now) + Timer / Factor >= ResumeTime
   
End Function


[사용법]
ex) 1초, 0.1초 딜레이 (실제 초단위로 입력)
Do
~~
~~
  DoEvents
  Pause (1) '1초 동안 sleep 딜레이
  Pause (0.1) '0.1초 동안 sleep 딜레이
Loop

단순 sleep을 통해 버벅거렸던 프로그래밍을 위 함수를 이용해 비동기식 딜레이를 사용해보세요^^!
더좋은 최적화 코딩이 있다면 댓글로 공유 부탁드립니다.

+ Recent posts