我想使用null循环实现延迟函数。但是完成循环一次所需的时间是编译器和机器相关的。我希望我的程序自己确定时间并将程序延迟指定的时间。任何人都可以告诉我如何做到这一点? N. B.有一个名为delay()的函数,它将系统挂起指定的毫秒数。是否可以在不使用此功能的情况下暂停系统?
答案 0 :(得分:3)
首先,你应该从不坐在循环中什么都不做。它不仅浪费能源(因为它让你的CPU 100%忙于计算你的循环计数器) - 在多任务处理系统中它也会降低整个系统的性能,因为你的进程正在获得所有的时间片 出现的时间正在做某事。
下一点是......我不知道任何delay()
函数。这不是标准C.实际上,直到C11,对于这样的事情根本就没有标准。
POSIX救援,有usleep(3)
(已弃用)和nanosleep(2)
。如果您使用的是符合POSIX标准的系统,那么您可以使用它们。它们阻止(意味着,操作系统的调度程序知道他们无事可做,只能在调用结束后安排它们),所以你不要浪费CPU能力。
如果你在Windows上,直接延迟代码,你只有Sleep()
。请注意,THIS函数需要几毫秒,但通常只有大约15ms的精度。通常足够好,但并非总是如此。如果您需要更好的窗口精度,可以使用timeBeginPeriod()
请求更多定时器中断... timeBeginPeriod(1);
将每毫秒请求一次定时器中断。一旦你不再需要精度,不要忘记用{em>相同的值调用timeEndPeriod()
,因为更多的定时器中断会带来成本:它们会使系统忙,因此浪费更多精力。
我最近在开发一个小游戏时遇到了类似的问题,我需要以10ms的间隔进行常数滴答,这就是我提出的for POSIX-compliant systems和for windows。此代码中的ticker_wait()
函数只会暂停,直到下一个滴答,如果您的原始意图是某个时间问题,这可能会有用。
答案 1 :(得分:2)
除非您使用的是实时操作系统,否则您直接编程的任何内容都不会准确无误。您需要使用系统函数来休眠一段时间,例如Linux中的usleep
或Windows中的Sleep
。
由于操作系统可能会在预期的确切时间之前或之后中断该过程,因此您应该在睡眠之前和之后获得系统时间,以确定您实际睡了多长时间。
编辑:
在Linux上,您可以使用gettimeofday
来获取当前系统时间,该时间具有微秒分辨率(实际时钟是否准确是一个不同的故事)。在Windows上,您可以使用GetSystemTimeAsFileTime
执行类似操作:
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
const unsigned __int64 epoch_diff = 11644473600000000;
unsigned __int64 tmp;
FILETIME t;
if (tv) {
GetSystemTimeAsFileTime(&t);
tmp = 0;
tmp |= t.dwHighDateTime;
tmp <<= 32;
tmp |= t.dwLowDateTime;
tmp /= 10;
tmp -= epoch_diff;
tv->tv_sec = (long)(tmp / 1000000);
tv->tv_usec = (long)(tmp % 1000000);
}
return 0;
}
答案 2 :(得分:1)
你可以做一些事情,比如找到它在某个时间点的确切时间,然后将它保持在一个while循环中,它会重新检查时间,直到它达到你想要的任何时间。然后它就会爆发并继续执行你的程序的其余部分。我不确定我是否在循环中看到了很多好处,而不仅仅是使用延迟函数。