睡眠()是否不准确?

时间:2013-10-17 12:40:50

标签: c windows time sleep

我正在研究计时系统,我将实现一个计时器类。

#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编译的程序。

NOW I THINK >>

3 个答案:

答案 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