tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル timeSetEventでタイマー処理
投稿日: 2017/05/31(Wed) 06:24
投稿者年金生活
既存のtimerは分解能も精度も悪いので、timeSetEventで書いてみました。
1〜50mSecで時間を計測してみた結果は以下のようになりました。
立ち上がり時がうまくいっていません。(実際は25mSec程度で使うので、実用上はオケ)
改善する方法はありますか? バグ落ちしそうなところはありませんか?
ちなみにWin7/VB2013です、VB歴ほぼなし。

1mSec: 2.57 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.85 0.99 0.90 0.99 0.98 0.98 0.98 0.98 0.99 0.98
5mSec: 5.97 0.00 3.38 4.99 5.02 4.98 4.91 5.00 5.02 5.01 4.94 4.99 4.97 4.94 5.01 5.02 4.93 5.01
10mSec: 11.73 2.52 10.00 9.97 9.95 9.99 9.96 9.98 9.98 9.99 9.96 9.95 10.00 9.98 9.98 9.99 9.97
50mSec: 51.91 42.45 49.98 49.94 49.97 49.97 49.93 49.94 49.98 49.91 49.98 49.95 50.01 49.98 49.90

=========================================
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        sw.Start()
        Call TimerStart(25)
    End Sub
End Class
===========================================
Module Module1

    Public Delegate Sub TimerProcDelegate(ByVal uID As Integer, _
        ByVal uMsg As Integer, _
        ByVal dwUser As Integer, _
        ByVal dw1 As Integer, _
        ByVal dw2 As Integer)
    Public Declare Function timeBeginPeriod Lib "winmm.dll" ( _
        ByVal uPeriod As Integer) As Integer
    Public Declare Function timeEndPeriod Lib "winmm.dll" ( _
        ByVal uPeriod As Integer) As Integer
    Public Declare Function timeSetEvent Lib "winmm.dll" ( _
        ByVal uDelay As Integer, _
        ByVal uResolution As Integer, _
        ByVal lpFunction As TimerProcDelegate, _
        ByVal dwUser As Integer, _
        ByVal uFlags As Integer) As Integer
    Public Declare Function timeKillEvent Lib "winmm.dll" ( _
        ByVal uID As Integer) As Integer

    Public gIntTimerID As Integer '高精度タイマID

    Public sw As New System.Diagnostics.Stopwatch()
    Private proc As TimerProcDelegate

    ' <<<< タイマの起動 >>>>
    Public Sub TimerStart(ByVal mSec As Integer)
        Call timeBeginPeriod(1)
        proc = AddressOf TimerProc
        gIntTimerID = timeSetEvent(mSec, 1, proc, 0, 1)
    End Sub

    ' <<<< タイマの停止 >>>>
    Public Sub TimerStop()
        Call timeKillEvent(gIntTimerID)
        Call timeEndPeriod(50)
        System.Threading.Thread.Sleep(100)
    End Sub

    ' <<<< 高精度タイマで繰り返す >>>>
    Public Sub TimerProc(ByVal uTimerID As Integer, ByVal uMsg As Integer, ByVal dwUser As Integer, ByVal dw1 As Integer, ByVal dw2 As Integer)

        sw.Stop()
        Console.Write((sw.Elapsed.ToString("fffff") / 100).ToString("0.00") & " ")
        sw.Restart()

    End Sub
End Module

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。