web-dev-qa-db-ja.com

タイマー間隔1000!= 1秒?

タイマーの秒を表示するラベルがあります(つまり、タイマーの間隔ごとに1が追加される変数があります)。タイマーの間隔は1000に設定されているため、ラベルは1秒ごとに更新されます(また、秒も表示されます)。しかし、ラベルはすでに数百の1秒後にあります。 1秒を取得するための適切な間隔は何ですか?

int _counter = 0;
Timer timer;

timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(TimerEventProcessor);
label1.Text = _counter.ToString();
timer.Start();

private void TimerEventProcessor(object sender, EventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
9

1秒を取得する適切な間隔は1000です。Intervalプロパティは、ティック間の時間をミリ秒単位で表したものです。

MSDN:Timer.Intervalプロパティ

したがって、設定した間隔が間違っているのではありません。タイマーの間隔を変更したり、Tickイベントを複数回バインドしたりするなど、コードの残りの部分を確認します。

10
Guffa

Tickイベントの代わりに、Elapsedイベントを使用します。

timer.Elapsed += new EventHandler(TimerEventProcessor);

timerEventProcessorメソッドの署名を変更します。

private void TimerEventProcessor(object sender, ElapsedEventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
5
daryal

TimerEventProcessorまたはCounterを使用する他の場所はありますか?

とにかく、毎秒1回正確に配信されるイベントに依存することはできません。時間は異なる場合があり、システムは平均時間が正しいことを確認しません。

したがって、_Counterの代わりに、次を使用する必要があります。

 // when starting the timer:
 DateTime _started = DateTime.UtcNow;

 // in TimerEventProcessor:
 seconds = (DateTime.UtcNow-started).TotalSeconds;
 Label.Text = seconds.ToString();

注:これは、TimerEventProcessorが頻繁に呼び出される問題、または_Counterが頻繁に増分される問題を解決しません。それは単にそれを隠すだけですが、それを行う正しい方法でもあります。

1
peterchen