2

重複の可能性:
ユーザー空間の Linux C/C++ タイマー シグナル ハンドラー

Cでタイマーを作成するにはどうすればよいですか? 特定のアクションを 5 秒ごとに 1 回、別のアクションを 2 秒ごとに実行したいですか?

これを達成するにはどうすればよいですか?誰かが良いリンクやコードを指摘できますか?

4

1 に答える 1

0

問題は定期的なタイマーを設定することではなく、異なる期間の 2 つのタイマーを使用することです。

残念ながら、2 は 5 を割ることはできませんが、1 秒の解像度タイマーとカウンターを使用できます。カウンターが 2 の倍数または 5 の倍数の場合は、好きなように処理できます。タイマーを使用して通常どおりシグナル ハンドラーを登録しますが、このハンドラーは次のようになります。

static int cnt = 0;

int handler(int) {
    cnt++;

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % 5 == 0) {
        action_b();
    }
}

オーバーフローの問題を取り除くために、たとえば次のようにして、2 と 5 の倍数に達したときにカウンターを 0 にリセットできます。

int handler(int) {
    cnt++;

    if (cnt == 10)
    {
        cnt = 0;
    }

    if (cnt % 2 == 0) {
        action_a();
    } 

    if (cnt % (2*5) == 0) {
        action_b();
    }
}

この手法は 2 つ以上の周期に一般化できることに注意してください。ただし、運が悪い場合、最小公分母は非常に小さい周期である可能性があるため、ほとんど使用しないで高いタイマー信号レートが得られる可能性があります。たとえば、999 ミリ秒の周期と 1000 ミリ秒の周期がある場合、1 ミリ秒ごとに信号が発生することになります。これは、精度とオーバーヘッドの点で理想的ではありませんが、2 秒と 5 秒の場合、これは許容できるはずです。毎秒信号。

于 2012-07-02T01:00:46.053 に答える