1

以下はコード スニペットです。

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

重い処理部分は 1 秒ごとにその役割を果たしています。1秒後にも「i」を表示したいのですが、完了後に出力全体が表示されます。a while を使用するのはあまりエレガントな方法ではないことはわかっていますが、簡単に思えました。これを達成するための最適な方法はどれですか?

私はunix、gccコンパイラでコードを実行しています

4

4 に答える 4

2

stdoutをフラッシュする必要があります。fflush(3)を使用してこれを行うことができます。

fflush(stdout);

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); を渡す必要があります。

他のコードが処理中で、処理が完了した後に値を表示する必要がある場合は、1 秒ごとにそのコードによって更新されるモニターを保持し、それに応じて表示することができます。Producer Consumer の問題のように聞こえますが、見てみると役立つかもしれません

于 2012-04-10T04:23:37.390 に答える
0

バッファなしで印刷する必要があります。これを行う簡単な方法は、printf の後に stdout をフラッシュすることです。

fflush(stdout);

または stderr に出力します。

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_MONOTONICでclock_gettimeを使用することをお勧めします。

于 2012-04-10T04:32:25.807 に答える