foo()
可変間隔で時々呼び出される関数(たとえば)があります。呼び出されると、時刻を確認し、それに応じてアクションを実行します。
私は次の方法でこれを行いました:
必要に応じてオブジェクトが
Forms.Timer
関数を呼び出すDiagnostics.Stopwatch
オブジェクトは、時間を決定し、何をすべきかを決定する目的で関数内で使用されます。
ただし、次の問題があります。foo()
タイマーのコールバックによって呼び出されると、ElapsedMilliseconds
通常、ストップウォッチ オブジェクトの値が予想よりも低くなります。たとえば、タイマーが 1000 に設定されているため、1000 ミリ秒後にfoo()
呼び出されますが、foo()
ボディ内で 900 をElapsedMilliseconds
返すfoo
と、経過時間が 900 であるかのように動作します (ただし、実際には 1000 ミリ秒が経過したため、アクション A を実行する必要があります)。
ElapsedMilliseconds がタイマーと一貫した値を持つような場合、タイマーとストップウォッチを同期するにはどうすればよいですか?
編集:いくつかのコード
私の問題を説明するサンプルコード:
//foo is the function that is called by timer's callback
public void foo()
{
//Let's see what time it is:
long currentTime = stopwatch.ElapsedMilliseconds();
Item = getCurrentItem(currentTime);
Item.Draw();
}
//this is the callback of timer
private void timer1_Tick(object sender, EventArgs e)
{
//set the timer for next time
timer1.Interval = Intervals[periodIdx++];
foo();
}
これは、間隔が完了するたびに何かを描画することになっていますがElapsedMilliseconds
、タイマーが要求するよりも早い値を返すため、間隔が終了しても次のアイテムは描画されません