我正在研究计时系统,我将实现一个计时器类。
#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毫秒!建议? (可能是select()的超时?)
注意:我在Windows 7 Ultimate x86上运行此程序。使用MinGW(C / C ++)x86编译的程序。
答案 0 :(得分:3)
Sleep()对操作系统的时钟中断率是准确的。默认情况下,Windows在每秒64次。或者每15.625毫秒一次,就像你发现的那样。
您可以提高该费率,调用timeBeginPeriod(10)。完成后使用timeEndPeriod(10)。您仍然需要正常的线程调度延迟,因此您仍然无法保证您的线程将在10毫秒后恢复运行。当机器负载很重时也不会。使用SetThreadPriority()来提升优先级,增加它的可能性。
答案 1 :(得分:1)
睡眠()的方式不正确。
它会导致线程在指定的时间内至少休眠,但不能保证操作系统会在指定时间内将控制权返回给您的线程。
答案 2 :(得分:1)
你的问题是“时钟”每秒只能打64次(我见过系统可以达到2000,但不会更高)。如果要创建计时器类,您可能希望具有比2000更高的分辨率。使用QueryPerformanceCounter
来获得更高的分辨率。有关示例,请参阅QueryPerformanceCounter and overflows。
请注意,如果您想以非常的短间隔休眠,则必须在紧密循环中调用QueryPerformanceCounter
。