我想使用空循环实现延迟函数。但是,完成一次循环所需的时间取决于编译器和计算机。我希望我的程序能够自己确定时间并延迟指定的时间量。有没有人能给我任何想法如何做到这一点呢?
注:有一个名为delay()的函数,可以暂停系统指定的毫秒数。是否可能在不使用此函数的情况下暂停系统?
注:有一个名为delay()的函数,可以暂停系统指定的毫秒数。是否可能在不使用此函数的情况下暂停系统?
delay()
函数。这不是标准C。实际上,在C11之前,根本没有关于这种东西的标准。usleep(3)
(已弃用)和nanosleep(2)
。如果你在一个符合POSIX标准的系统上,那么你可以使用它们。它们会阻塞(意味着你的操作系统调度程序知道它们没事可做,并将它们安排在调用结束后),所以你不会浪费CPU功率。Sleep()
函数。请注意,此函数以毫秒为单位计算时间,但通常只有约15ms的精度。通常足够好,但并非总是如此。如果您需要更好的精度,请使用timeBeginPeriod()
来请求更多的定时器中断... {{code>timeBeginPeriod(1);
}}将请求每毫秒一个定时器中断。不要忘记在不再需要精度时使用相同的值调用timeEndPeriod()
,因为更多的定时器中断会增加系统的负担,从而浪费更多的能源。ticker_wait()
函数仅会暂停,直到下一个时钟周期。如果您的初衷是解决时间问题,这可能有所帮助。除非你在实时操作系统上,否则你直接编写的任何程序都不会很准确。你需要使用系统函数来休眠一段时间,例如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;
}
gettimeofday(2)
自SUS v4以来已经过时,您应该推荐使用clock_gettime(2)
。 - Filipe Gonçalves
thrd_sleep
。不幸的是,还没有所有编译器实现它,但它即将到来。 - Jens Gustedt