[VBNET]定時整點動作

有時,我們需要每隔幾秒做某件事,但是不論是 VB / VBNET / C# 哪種程式語言,都是呼叫系統的 Timer ,時間久了就會開始誤差,每隔一段時間誤差可能就會累積到一秒以上,造成時間並不能與所需的相符。
 
此例為從 2 秒起每 5 秒執行一次, 也就是 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57 秒定時執行,經測試,即時誤差小於 +- 15ms ,並可持續執行,另外考慮到當下個中斷時間過近,可能造成較大的誤差,因此當下個時間與目前時間誤差小於 20 ms ,直接跳到下下個時間。
 
考慮到要同時支援 WinForm Timer 跟 System Timer ,因此引數使用 Object 來處理。
 

VB2008 原始碼

Private Sub timerInterval_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timerInterval.Tick

     做某些事

     ResetTimerInterval(timerInterval, New TimeSpan(0, 0, 5), New TimeSpan(0, 0, 2))

End Sub

 

Friend Function ResetTimerInterval(ByVal oTimer As Object, ByVal intervalTimeSpan As TimeSpan, ByVal offsetTimeSpan As TimeSpan) As Integer

     Dim nextTime As Date = New Date(-Int(-(DateTime.Now.Ticks – offsetTimeSpan.Ticks) / intervalTimeSpan.Ticks) * intervalTimeSpan.Ticks + offsetTimeSpan.Ticks)

     Dim nowMillisecond As Integer = (nextTime.Ticks – DateTime.Now.Ticks) / TimeSpan.TicksPerMillisecond

     If nowMillisecond <= 20 Then nowMillisecond += intervalTimeSpan.TotalMilliseconds

     oTimer.Interval = nowMillisecond

     Return nowMillisecond

End Function

 

 
 
廣告
Categories: 技術分享 | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: