High Accuracy Wait/Sleep ?

NeuralJack

Centurion
Joined
Jul 28, 2005
Messages
138
I need some high accuracy Wait/Sleep/Pauses for an application i'm writing. Currently, I am using an AutoResetEvent in wait mode to pull this off so that I can break the Wait w/out aborting a thread.

I can't seem to pull off a Pause with a higher accuracy than 10ms. This is the case even when I use thread.sleep to do the pause.

So, currently, using either of those methods if i set the wait time anywhere between 0-10ms , it will be a wait time of EITHER 0 OR 10 ms. The pauses have a resolution of 10ms. If the wait is set to 15ms, it will either wait 10 or 20ms.

I have tried using the 'timeBeginPeriod' and 'timeEndPeriod' API's to increase the Pause resolution, but it doesnt seem to work. This may be because thread.sleep and AutoresetEvent.wait uses the OS Kernel Waitable, while the 'timeBeginPeriod' and 'timeEndPeriod' work on the multimedia timer service. But, it seemed to work correctly for this guy: http://www.dotnet247.com/247reference/msgs/57/289291.aspx

If you can help me Implement this strategy better, or provide another one that'd be great. I'd like a Pause/Sleep that is Breakable, with a resoltion of about 1ms

Here is what I currently Have (Both methods Wait for either 0 or 10ms, but nothing inbetween):
Code:
'API Declarations
    Public Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal period As Integer) As Integer
    Public Declare Function timeEndPeriod Lib "winmm.dll" (ByVal period As Integer) As Integer

Code:
Private Sub Test()
   Dim TestThread As New Thread(AddressOf TestFuncThread)
   TestThread.IsBackground = True
   TestThread.Start()
End Sub


    Private Sub TestFuncThread()
        Dim ARE As New AutoResetEvent(False)
        Dim StartTime As New Date
        Dim EndTime As New Date

        'Test Thread.Sleep Non-Breakable Sleep
        StartTime = Now
        timeBeginPeriod(1)
        Thread.Sleep(5)
        timeEndPeriod(1)
        EndTime = Now
        Debug.WriteLine("Actual Thread.Sleep (ms):" + EndTime.Subtract(StartTime).TotalMilliseconds.ToString)

        'Test AutoResetEvent Breakable Wait
        StartTime = Now
        ARE.Reset()
        timeBeginPeriod(1)
        ARE.WaitOne(5, False)
        timeEndPeriod(1)
        EndTime = Now
        Debug.WriteLine("Actual AutoResetEvent Wait (ms):" + EndTime.Subtract(StartTime).TotalMilliseconds.ToString)

    End Sub
 
Last edited:
Back
Top