我将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
结束模块