func() などの関数を 1 秒に 1 回だけ実行したい。ただし、func() の実行時間は約 500 ミリ秒です。どうやってやるの?関数の実行時間が短い場合は、各実行後に func() と sleep() に 1 秒間 while ループを記述できます。しかし今、実行時間は長いです。func() が正確に毎秒 1 回実行されるようにするにはどうすればよいですか? ありがとう。
2 に答える
3
やります:
- start_time で現在の時刻を取得します。
- 仕事を遂行する
- end_time で現在の時刻を取得する
- (1 秒 + start_time - end_time) 待ちます
そうすれば、毎秒確実にタスクを実行できます。タスクにかかる時間が短い場合は、より長く待機し、その逆も同様です。ただし、これは、タスクにかかる時間が常に 1 秒未満であることを前提としていることに注意してください。実行します。実際のコードでは、sleep ステートメントの前にそれを確認する必要があります。
実装の詳細はプラットフォームによって異なります。
この方法を使用しても、ステップ 4 の計算に時間がかかるため、小さなドリフトが生じることに注意してください。より正確な代替手段は、1 秒の整数倍で同期することです。そうすれば、何千回ものサイクルでドリフトすることはありません。
必要な精度のレベルによって異なります。
于 2013-03-24T03:23:24.793 に答える
1
野蛮でコーディングが簡単なソリューションが必要な場合は、関数を最初に実行する前の時間を取得して、変数(start_time)に保存できます。次の繰り返し番号を格納する繰り返しインデックスカウント変数(repeat_number)を作成します。次に、これを行うことができます:
1) next_run_time = ++repeat_number*1sec + start_time;
2) func();
3) wait_time = next_run_time - current_time;
4) sleep(wait_time)
5) goto 1;
このアプローチは、各反復での時間エラーの累積を無効にします。
ただし、実際のアプリケーションでは、イベントフレームワークまたはライブラリを見つける必要があります。
于 2013-03-24T03:29:01.957 に答える