2

11:00、12:00 など、1 時間ごとにいくつかのパラメーターを変更する必要がある Linux 上のアプリケーションがあり、システムの日付はユーザーがいつでも変更できます。

時間が xx:59 から xx+1:00 に変わったときに私に提供する信号、posix 関数はありますか?

通常、localtime(3)秒ごとに現在の時刻を取得してから、分の部分が と等しいかどうかを比較し0ます。ただし、これは良い方法ではないようです。変更を検出するには、1 時間ごとに同じ関数を呼び出す必要があります。特に、少ないリソースを使用するのに適した組み込みボードでコードを実行します。

これが私がそれを行う方法のサンプルコードです:

static char *fetch_time() { // I use this fcn for some other purpose to fetch the time info
    char *p;
    time_t rawtime;
    struct tm * timeinfo;
    char buffer[13];
    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime (buffer,13,"%04Y%02m%02d%02k%02M",timeinfo);
    p = (char *)malloc(sizeof(buffer));
    strcpy(p, buffer);
    return p;
}


static int hour_change_check(){
    char *p;
    p = fetch_time();
    char current_minute[3] = {'\0'};
    current_minute[0] = p[10];
    current_minute[1] = p[11];
    int current_minute_as_int = atoi(current_minute);
    if (current_minute_as_int == 0){
        printf("current_min: %d\n",current_minute_as_int);
        free(p);
        return 1;
    }
    free(p);
    return 0;
}

int main(void){
    while(1){
    int x = hour_change_check();
    printf("x:%d\n",x);
    sleep(1);
    }
    return 0;
}
4

2 に答える 2

0

1 秒に 1 回 (または、他のコメントを考えると 2 回) 時間をポーリングするソリューションで使用されるオーバーヘッドを実際に測定しましたか?

呼び出される命令の数は最小限であり、ループはありません。さらに悪いことに、CPU は 100 マイクロ秒 (0.1 ミリ秒、または 0.0001 秒) の時間を使用する可能性があります。この見積もりは、組み込みシステムで使用されているプロセッサとそのクロック速度に大きく依存しますが、ポーリング ロジックが使用可能な合計時間の 1/1000 を使用する可能性があるという考えです

また、コードを最適化して、常に計算を実行し、すぐに解放する必要があるhour_change_check別の関数を呼び出さないようにすることもできます。mallocまた、これが組み込みの *nix システムである場合、このポーリング ロジックを独自のスレッドで実行して、発行時にsleep()他の作業単位に干渉したり遅延したりしないようにすることはできますか。

したがって、問題を測定し、それが重大な問題であるかどうかを確認します。ポーリングのパフォーマンスは、ユーザーが時間を変更したときに時間の変更を検出する必要があるという要件とのバランスを取る必要があります。つまり、ユーザーが時間を変更しても、毎秒ポーリングすると時間のロールオーバーが発生すると思いますが、オーバーヘッドはそれだけの価値があります。では、正確には、どのくらいのオーバーヘッドがあるのでしょうか?

于 2013-08-11T07:25:27.323 に答える