1

以下是代码片段。

int main()
{
int i =0;
    while (i++ < 5)
    {
        // Do some heavy processing
        printf("i = %d\n", i);
        sleep(1);
    }
}

繁重的处理部分每 1 秒完成一次。我也想在 1 秒后显示“i”,但它在完成后显示整个输出。我知道使用一段时间并不是一种非常优雅的方式来做到这一点,但它似乎更容易。实现这一目标的最佳方式是什么?

我在 unix、gcc 编译器中运行代码

4

4 回答 4

2

您需要刷新标准输出;您可以使用 fflush(3) 这样做:

fflush(stdout);

您还可以在标准输出上完全禁用缓冲:

setbuf(stdout, NULL);
于 2012-04-10T04:41:01.183 回答
1

在窗口中:

 #include <windows.h>

    Sleep(number of milliseconds);

或在基本 C 中使用它:

 #include <unistd.h>

    unsigned sleep(unsigned seconds);

对于 unix:

sleep n  //n is the number of sec 
于 2012-04-10T04:29:02.180 回答
0

sleep 以毫秒为单位获取其参数,因此您必须通过 sleep(10000);

如果其他一些代码正在处理并且在处理完成后您必须显示该值,而不是每隔一秒您可以保留一个由该代码更新的监视器,然后相应地显示。听起来像生产者消费者问题,如果你看一下可能会有所帮助

于 2012-04-10T04:23:37.390 回答
0

您需要打印无缓冲,简单的方法是在 printf 之后 fflush stdout

fflush(stdout);

或打印到标准错误。

fprintf(stderr, "i = %d\n", i);

同样重要的是要注意,这不是每 1 秒打印一次,而是每 1 秒打印一次 + 可能因循环而异的繁重处理持续时间。为了改善这一点,你应该(伪代码不是真正的代码)。

int i = 0;
for(i=0; i < 5; i++)
{
    measure before time
    do stuff
    measure after time 
    sleep( 1 - (after -before in seconds)) or better usleep( 1000000 - (after - before in microseconds))
    print something
}

此方法允许您大约每 1 秒打印一次(只要做的东西花费的时间少于 1 秒)

如果这是特定于 linux 的,我建议使用clock_gettime和 CLOCK_MONOTONIC 来测量时间。

于 2012-04-10T04:32:25.807 回答