在C中实现时间延迟功能

时间:2015-07-21 19:55:49

标签: c delay

我想使用null循环实现延迟函数。但是完成循环一次所需的时间是编译器和机器相关的。我希望我的程序自己确定时间并将程序延迟指定的时间。任何人都可以告诉我如何做到这一点? N. B.有一个名为delay()的函数,它将系统挂起指定的毫秒数。是否可以在不使用此功能的情况下暂停系统?

3 个答案:

答案 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 systemsfor 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循环中,它会重新检查时间,直到它达到你想要的任何时间。然后它就会爆发并继续执行你的程序的其余部分。我不确定我是否在循环中看到了很多好处,而不仅仅是使用延迟函数。