2012-04-10 19 views
1

以下是代码段。使用睡眠后不能在常规间隔后显示输出

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

重处理部分正在每1秒完成一部分。 我想在1秒后显示'i',但它在完成后显示整个输出。我知道使用一段时间不是一个很好的方法来做到这一点,但似乎更容易。这是达到这个目标的最佳方式?

我运行在UNIX代码,

+0

它不显示后,每一秒的输出,但它出来,而之后 – Nikhil 2012-04-10 04:33:14

+1

尝试#include ,然后使用fflush(stdout); – VoidStar 2012-04-10 04:33:37

回答

2

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

fflush(stdout); 

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

setbuf(stdout, NULL); 
0

睡眠需要以毫秒为单位的参数,所以你必须通过睡眠(10000)GCC编译器;

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

+2

睡眠(windows.h)以毫秒为单位获取其参数.sleep以秒为单位获取其参数。 – 2012-04-10 04:28:15

+0

http://pubs.opengroup.org/onlinepubs/009604599/functions/sleep.html – Nikhil 2012-04-10 04:29:37

1
在Windows

#include <windows.h> 

    Sleep(number of milliseconds); 

或使用此基础C:

#include <unistd.h> 

    unsigned sleep(unsigned seconds); 

在Unix上:

sleep n //n is the number of sec 
+0

我在unix,gcc编译器中运行代码。这不起作用 – Nikhil 2012-04-10 04:32:12

+0

我编辑了更多阅读答案http://en.wikipedia.org/wiki/Sleep_(Unix) – 2012-04-10 04:38:22

0

您需要打印无缓冲区,执行该操作的简单方法是在printf后fflush stdout

fflush(stdout); 

或打印到stderr。

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

另外需要注意的是,这是不打印每1秒但每1秒持续时间+重处理的可从循环变化以循环是很重要的。为了改善这一点,你应该(psuedocode不是真正的代码)。

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测量时间。