3

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

#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 毫秒!建议?(也许选择()的超时?)

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

现在我想>>

4

3 回答 3

4

Sleep() 精确到操作系统的时钟中断率。默认情况下,Windows 每秒滴答 64 次。或者你发现的每 15.625 毫秒一次。

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

于 2013-10-17T12:47:28.223 回答
2

您的问题是“时钟”每秒仅滴答 64 次(我见过可以达到 2000 的系统,但不会更高)。如果您正在创建一个计时器类,您可能希望获得比 2000 更高的分辨率。使用QueryPerformanceCounter以获得更高的分辨率。有关示例,请参阅QueryPerformanceCounter 和溢出。

请注意,如果您想睡短的时间间隔,您将不得不QueryPerformanceCounter在一个紧密的循环中调用。

于 2013-10-17T12:52:15.233 回答
1

Sleep() 并不像您希望的那样准确。

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

于 2013-10-17T12:47:56.180 回答