使用clock()的延迟功能

时间:2014-01-05 21:13:27

标签: c printf time.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void delay(double sec)
{
    clock_t start = clock();

    while ((clock() - start) / CLOCKS_PER_SEC < sec)
        ;       
}

int main()
{
    for (int i = 0; i < 100000; i++) {
        printf("%d  ", i);
        delay(1);
    }

    return 0;
}

我编写了一个延迟函数并使用此代码对其进行了测试,但我没有在标准输出中看到任何数字。

然后我改变了printf()调用:

printf("%d \n", i);

有趣的是,它奏效了。我也试过没有延迟的功能:

    for (int i = 0; i < 100000; i++)
        printf("%d  ", i);

它也有效。我在这里错过了什么?为什么我在运行第一个代码时看不到任何数字?谢谢你的帮助:)

2 个答案:

答案 0 :(得分:1)

因为输出是缓冲的。大多数终端将缓冲标准输出,直到遇到换行符(\n)或调用fflush(stdout)为止。

包含对delay的调用的循环最终应打印数字,但程序完成后。

fflush(stdout);之后添加printf - 调用以使数字立即显示而不会在其间插入新行。

答案 1 :(得分:1)

嗯,有两个原因。首先,printf()并不总是刷新其输出,因此您实际上可能会超过printf语句,但仍然没有在终端上看到任何内容。文本被缓冲。放入\n可能会导致它刷新输出,这就是为什么会有效。

第二个问题是您没有将任何值传递给delay()函数。所以它可能使用了一些随机值,然后悬挂。

我还想指出clock()会返回CPU时间,而不是“挂钟”时间,所以实际上可能需要的时间比你想象的要长。

延迟函数很棘手,这就是为什么有很多系统调用来执行它们。请参阅sleep()