为什么threading.timer在我的代码中每1ms都没有执行一次?

时间:2015-06-13 08:29:57

标签: multithreading timer

我将threading.timer间隔时间设置为100ms。从控制台输出,时间间隔约为1.6秒。为什么不每100毫秒在控制台输出中写一行?我想要的是一个1ms精确的定时器,所以我可以在我的代码中使用它来模拟PLC实时系统。

Module Module1
Class StateObjClass
    ' Used to hold parameters for calls to TimerTask 
    Public SomeValue As Integer
    Public TimerReference As System.Threading.Timer
    Public TimerCanceled As Boolean
    Public GLO_TICK As Long
End Class

Public StateObj As New StateObjClass
Public long_Temp1 As Long
Public int16_temp1 As Int16

Sub RunTimer()

    StateObj.TimerCanceled = False
    StateObj.SomeValue = 1
    Dim TimerDelegate As New Threading.TimerCallback(AddressOf TimerTask)
    ' Create a timer that calls a procedure every 2 seconds. 
    ' Note: There is no Start method; the timer starts running as soon as  
    ' the instance is created. 
    Dim TimerItem As New System.Threading.Timer(TimerDelegate, StateObj, _
                                               0, 1)
    StateObj.TimerReference = TimerItem  ' Save a reference for Dispose.
    Dim a As Boolean = False

    Dim state As Int16
    While True ' Run for ten loops.
        'System.Threading.Thread.Sleep(1000)  ' Wait one second.

        Select Case state
            Case 0
                If a Then
                    long_Temp1 = StateObj.GLO_TICK
                Else
                    a = True
                    long_Temp1 = StateObj.GLO_TICK
                    Console.WriteLine("a=" & a & Now)
                End If
                state = 1
                Exit Select
            Case 1
                Calculate_Interval(long_Temp1, int16_temp1)
                If int16_temp1 > 100 Then
                    a = False
                    long_Temp1 = StateObj.GLO_TICK
                    Console.WriteLine("a=" & a & Now)
                    state = 2
                End If
                Exit Select
            Case 2
                Calculate_Interval(long_Temp1, int16_temp1)
                If int16_temp1 > 100 Then
                    a = True
                    long_Temp1 = StateObj.GLO_TICK
                    Console.WriteLine("a=" & a & Now)
                    state = 1
                End If
                Exit Select
        End Select

    End While

    StateObj.TimerCanceled = True  ' Request Dispose of the timer object.
End Sub

Sub TimerTask(ByVal StateObj As Object)
    Dim State As StateObjClass = CType(StateObj, StateObjClass)

    If State.TimerCanceled Then    ' Dispose Requested.
        System.Diagnostics.Debug.WriteLine("Done  " & Now)
        State.TimerReference.Dispose()
    End If

    System.Threading.Interlocked.Increment(State.GLO_TICK)
End Sub
Sub Main()
    RunTimer()
    Console.Read()

End Sub

Function Calculate_Interval(ByVal IntervalStart As Long, ByRef Interval_ms As Int16) As Int16
    Interval_ms = Convert.ToInt16(StateObj.GLO_TICK - IntervalStart)
    Return Interval_ms
End Function

结束模块

0 个答案:

没有答案