10

タイマーの秒数を表示するラベルがあります (つまり、タイマーの間隔ごとに 1 が追加される変数があります)。タイマーの間隔は 1000 に設定されているため、ラベルは毎秒更新されます (また、秒も表示されるはずです)。しかし、ラベルは 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;
}
4

4 に答える 4

11

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

MSDN: Timer.Interval プロパティ

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

于 2013-01-18T09:27:37.170 に答える
5

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

timer.Elapsed += new EventHandler(TimerEventProcessor);

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

private void TimerEventProcessor(object sender, ElapsedEventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
于 2013-01-18T09:22:21.587 に答える
1

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

とにかく、イベントが1秒に1回正確に配信されることを信頼することはできません。時間は変動する可能性があり、システムは平均時間が正しいことを確認しません。

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

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

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

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

于 2013-01-18T09:33:36.110 に答える
0

すでに古いスレッドですが、System.Timer はオペレーティング システムに依存するというマイクロソフトの記事を読みました。つまり、Windows 7 を使用していて、間隔が 15 ミリ秒未満の場合、間隔が遅れます。

Interval プロパティを使用して、Elapsed イベントが発生する頻度を決定します。Timer クラスはシステム クロックに依存するため、システム クロックと同じ分解能を持ちます。これは、Interval プロパティがシステム クロックの分解能よりも小さい場合、システム クロックの分解能によって定義された間隔で Elapsed イベントが発生することを意味します。次の例では、Interval プロパティを 5 ミリ秒に設定します。システム クロックの分解能が約 15 ミリ秒の Windows 7 システムで実行すると、イベントは 5 ミリ秒ごとではなく、約 15 ミリ秒ごとに発生します。

于 2021-09-18T18:38:54.887 に答える