【问题标题】:delay function using clock()使用clock()的延迟函数
【发布时间】:2014-01-05 21:13:27
【问题描述】:
#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);

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

【问题讨论】:

  • 为什么不用普通的sleep()函数?
  • 我可以使用它,但出于好奇我问了这个。
  • @TimCooper 我编辑了代码。这是错误的
  • 虽然这不是您的主要观点,但我想指出,忙碌等待非常糟糕,因为它会消耗 CPU 时间 - 至少在多任务操作系统上是这样。
  • @yunusaydin 正如其他人指出的那样,sleep()。或者操作系统提供的其他东西。这告诉操作系统下次不要接触这个进程,因此不会消耗 CPU 时间。在忙于等待时,进程获得了完全的 CPU 时间,基本上什么都不做。

标签: c printf time.h


【解决方案1】:

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

包含对delay 的调用的循环最终应该会打印数字,但要在程序完成时打印。

printf-调用之后添加fflush(stdout);,使数字立即出现,中间没有换行符。

【讨论】:

  • 你说的有效。谢谢 :) 但我有一个问题。延迟循环最终不会打印数字。什么原因?
  • 你确定吗? 100000 'seconds' (请参阅 Chris J. Kiick 关于clock 粒度的回答)相当长(> 27 小时),你让程序完成吗?由于某种原因,我的终端没有缓冲,我可以看到这些数字立即出现,尽管打印它们需要相当长的时间。尝试循环到 100。
  • 是的,你是对的 :) 这是一个愚蠢的错误。谢谢你的帮助。
  • @Kninnug 本质上,它不仅会刷新 \n 上的缓冲区,还会填充标准缓冲区(例如 4KB)。但是使用海报的方法和这个缓冲区大小大约需要。 1050 秒 = 17.5 分钟 - 对于人类的耐心来说已经足够了,除非被转移到晚餐时间:)
【解决方案2】:

嗯,有两个原因。首先,printf() 并不总是刷新它的输出,所以你实际上可能通过了printf 语句并且仍然在你的终端上看不到任何东西。文本被缓冲。输入\n 可能会导致它刷新其输出,这就是它起作用的原因。

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

我还想指出,clock() 返回的是 CPU 时间,而不是“挂钟”时间,因此它实际上可能需要比您想象的更长的时间。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多