睡眠()是不准确的?

我正在开发一个计时系统,我将实现一个计时器课程。

#include <windows.h> #include <stdio.h> #include <time.h> int main() { clock_t t1, t2; t1 = clock(); Sleep(10); t2 = clock(); printf("%i\n", (int)(t2 - t1)); return 0; } 

该程序应打印“10”,但打印“15”或“16”。 我需要更准确的,这是不到1毫秒! build议? (也许用select()的超时?)

注意:我已经在Windows 7 Ultimate x86上运行该程序。 用MinGW(C / C ++)x86编译的程序

现在我想>>

Sleep()对于操作系统的时钟中断速率是准确的。 在Windows上,默认情况下每秒钟64次。 或者每15.625毫秒一次,正如你发现的那样。

你可以增加这个速度,调用timeBeginPeriod(10)。 完成后使用timeEndPeriod(10)。 你仍然受到正常的线程调度延迟的影响,所以你仍然不能保证你的线程在10毫秒后恢复运行。 当机器负载过重时不会。 使用SetThreadPriority()提高优先级,增加它的可能性。

睡眠()在你想要的方式是不准确的。

它会导致线程至少在指定的时间内进入休眠状态,但不能保证操作系统会在指定的时间将控制权返回给线程。

你的问题是,“时钟”每秒只能打64次(我见过的系统可以达到2000,但不会更高)。 如果你正在创建一个计时器类,你甚至可能想要比2000年更高的分辨率。使用QueryPerformanceCounter来获得更高的分辨率。 查看QueryPerformanceCounter并溢出一个示例。

请注意,如果您想要休眠短的时间间隔,您将不得不在紧密的循环中调用QueryPerformanceCounter