我正在研究一个计时系统,我将实现一个计时器类。
#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()的超时?)
注意:我已经在Windows7终极x86上运行了这个程序。用MinGW (C/C++) x86编写的程序。
发布于 2013-10-17 04:47:28
睡眠()对操作系统的时钟中断率是准确的。默认情况下,在Windows上每秒运行64次。或者每15.625毫秒一次,就像你发现的那样。
你可以提高这个速率,打电话给timeBeginPeriod(10)。完成后使用timeEndPeriod(10)。您仍然受制于正常的线程调度延迟,因此仍然无法保证线程在10毫秒后恢复运行。当机器装得很重的时候就不会了。使用SetThreadPriority()来提高优先级,增加它的可能性。
发布于 2013-10-17 04:52:15
你的问题是,“时钟”每秒只滴答64次(我看到的系统可以达到2000,但没有更高)。如果您正在创建一个timer类,您可能希望获得比2000更高的分辨率。使用QueryPerformanceCounter
获得更高的分辨率。有关示例,请参见QueryPerformanceCounter and overflows。
请注意,如果您希望睡眠时间很短,则必须在一个紧循环中调用QueryPerformanceCounter
。
发布于 2013-10-17 04:47:56
睡眠()按你想要的方式是不准确的。
它将导致线程至少在指定的时间内休眠,但不能保证操作系统会在指定的时间返回对线程的控制。
https://stackoverflow.com/questions/19427034
复制