My understanding of the Sleep function is that it follows “at least semantics” i.e. sleep(5) will guarantee that the thread sleeps for 5 seconds, but it may remain blocked for more than 5 seconds depending on other factors. Is there a way to sleep for exactly a specified time period (without busy waiting).
My understanding of the Sleep function is that it follows at least semantics i.e.
Share
As others have said, you really need to use a real-time OS to try and achieve this. Precise software timing is quite tricky.
However… although not perfect, you can get a LOT better results than “normal” by simply boosting the priority of the process that needs better timing. In Windows you can achieve this with the
SetPriorityClassfunction. If you set the priority to the highest level (REALTIME_PRIORITY_CLASS: 0x00000100) you’ll get much better timing results. Again – this will not be perfect like you are asking for, though.This is also likely possible on other platforms than Windows, but I’ve never had reason to do it so haven’t tested it.
EDIT: As per the comment by Andy T, if your app is multi-threaded you also need to watch out for the priority assigned to the threads. For Windows this is documented here.
Some background…
A while back I used
SetPriorityClassto boost the priority on an application where I was doing real-time analysis of high-speed video and I could NOT miss a frame. Frames were arriving to the pc at a very regular (driven by external framegrabber HW) frequency of 300 frames per second (fps), which fired a HW interrupt on every frame which I then serviced. Since timing was very important, I collected a lot of stats on the interrupt timing (usingQueryPerformanceCounterstuff) to see how bad the situation really was, and was appalled at the resulting distributions. I don’t have the stats handy, but basically Windows was servicing the interrupt whenever it felt like it when run at normal priority. The histograms were very messy, with the stdev being wider than my ~3ms period. Frequently I would have gigantic gaps of 200 ms or greater in the interrupt servicing (recall that the interrupt fired roughly every 3 ms)!! ie: HW interrupts are FAR from exact! You’re stuck with what the OS decides to do for you.However – when I discovered the
REALTIME_PRIORITY_CLASSsetting and benchmarked with that priority, it was significantly better and the service interval distribution was extremely tight. I could run 10 minutes of 300 fps and not miss a single frame. Measured interrupt servicing periods were pretty much exactly 1/300 s with a tight distribution.Also – try and minimize the other things the OS is doing to help improve the odds of your timing working better in the app where it matters. eg: no background video transcoding or disk de-fragging or anything while your trying to get precision timing with other code!!
In summary:
Since it may be helpful (although a bit off topic), here’s a small class I wrote a long time ago for using the high performance counters on a Windows machine. It may be useful for your testing:
CHiResTimer.h
CHiResTimer.cpp