web-dev-qa-db-ja.com

Cでタイマーを使用するには?

Cでタイマーを使用する方法は何ですか?私は仕事のために500ミリ秒まで待つ必要があります。この仕事をする良い方法を教えてください。私はsleep(3);を使用しましたが、このメソッドはその期間中は何もしません。その時まで何かを入力しようとするものがあります。

8
user2332426

_time_t_構造体と clock() 関数をtime.hから使用できます。

clock()を使用して_time_t_構造体に開始時間を保存し、保存された時間と現在の時間の差を比較して経過時間を確認します。

8
Qutus

ここに私が使用したソリューションがあります(#include <time.h>):

int msec = 0, trigger = 10; /* 10ms */
clock_t before = clock();

do {
  /*
   * Do something to busy the CPU just here while you drink a coffee
   * Be sure this code will not take more than `trigger` ms
   */

  clock_t difference = clock() - before;
  msec = difference * 1000 / CLOCKS_PER_SEC;
  iterations++;
} while ( msec < trigger );

printf("Time taken %d seconds %d milliseconds (%d iterations)\n",
  msec/1000, msec%1000, iterations);
10
David Guyon

はい、ループが必要です。すでにメインループがある場合(ほとんどのGUIイベント駆動型のものがあります)、おそらくタイマーをその中に入れることができます。使用する:

#include <time.h> 
time_t my_t, fire_t;

次に(1秒を超える時間)、現在の時間を読み取ってタイマーを初期化します。

my_t = time(NULL);

タイマーが待機する秒数を追加し、fire_tに保存します。 time_tは基本的にuint32_tであり、キャストする必要がある場合があります。

ループ内で別の操作を行います

my_t = time(NULL);

if(my_t> fire_t)タイマーの起動を考慮し、そこで必要なことを行います。これにはおそらく、次回に別のfire_t = time(NULL)+ seconds_to_waitを実行してリセットすることが含まれます。

Time_tは、1970年1月1日午前0時からの秒数として時間を格納する、多少古くなったUNIX方式ですが、多くの利点があります。 1秒未満の場合は、gettimeofday()(マイクロ秒)またはclock_gettime()(ナノ秒)を使用し、time_tおよびその1秒マーク以降のマイクロ秒またはナノ秒であるstruct timevalまたはstruct timespecを処理する必要があります。タイマーの作成は、待機時間を追加するとき、結果のマイクロ秒またはナノ秒の値が1秒を超える場合、手動でキャリー(time_tへ)を行うことを忘れないでください。はい、面倒です。 man 2 time、man gettimeofday、man clock_gettimeを参照してください。

sleep()、usleep()、nanosleep()には隠れた利点があります。プログラムを一時停止しているように見えますが、実際に実行しているのはその時間だけCPUを解放することです。時間を読み取り、完了時間と比較してポーリングを繰り返すと(まだありますか?)、多くのCPUサイクルが消費され、同じマシンで実行中の他のプログラムの速度が低下する可能性があります(そして、より多くの電力/バッテリーを使用します)。ほとんどの場合、sleep()を実行してから、時間のチェックを開始することをお勧めします。

スリープしようとすると同時に仕事をする場合は、スレッドが必要です。

2
Alan Corey

この例はあなたに役立つかもしれません

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


/*
    Implementation simple timeout

    Input: count milliseconds as number

    Usage:
        setTimeout(1000) - timeout on 1 second
        setTimeout(10100) - timeout on 10 seconds and 100 milliseconds
 */
void setTimeout(int milliseconds)
{
    // If milliseconds is less or equal to 0
    // will be simple return from function without throw error
    if (milliseconds <= 0) {
        fprintf(stderr, "Count milliseconds for timeout is less or equal to 0\n");
        return;
    }

    // a current time of milliseconds
    int milliseconds_since = clock() * 1000 / CLOCKS_PER_SEC;

    // needed count milliseconds of return from this timeout
    int end = milliseconds_since + milliseconds;

    // wait while until needed time comes
    do {
        milliseconds_since = clock() * 1000 / CLOCKS_PER_SEC;
    } while (milliseconds_since <= end);
}


int main()
{

    // input from user for time of delay in seconds
    int delay;
    printf("Enter delay: ");
    scanf("%d", &delay);

    // counter downtime for run a rocket while the delay with more 0
    do {
        // erase the previous line and display remain of the delay
        printf("\033[ATime left for run rocket: %d\n", delay);

        // a timeout for display
        setTimeout(1000);

        // decrease the delay to 1
        delay--;

    } while (delay >= 0);

    // a string for display rocket
    char rocket[3] = "-->";

    // a string for display all trace of the rocket and the rocket itself
    char *rocket_trace = (char *) malloc(100 * sizeof(char));

    // display trace of the rocket from a start to the end
    int i;
    char passed_way[100] = "";
    for (i = 0; i <= 50; i++) {
        setTimeout(25);
        sprintf(rocket_trace, "%s%s", passed_way, rocket);
        passed_way[i] = ' ';
        printf("\033[A");
        printf("| %s\n", rocket_trace);
    }

    // erase a line and write a new line
    printf("\033[A");
    printf("\033[2K");
    puts("Good luck!");

    return 0;
}

ファイルをコンパイルし、実行してから削除します(私の好み)

$ gcc timeout.c -o timeout && ./timeout && rm timeout

自分で実行して結果を確認してください。

ノート:

テスト環境

$ uname -a
Linux wlysenko-Aspire 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2
PADYMKO