2013-01-18 18 views
6

私は自分のタイマーの秒を表示するラベルを持っています(言い換えれば、タイマーの間隔ごとに1つの変数が追加されています)。私のタイマーの間隔は1000に設定されているので、ラベルは毎秒更新されるはずです(秒も表示されるはずです)。しかし、ラベルはすでに1秒後に数百になります。 1秒を得るための適切な間隔は何ですか?タイマー間隔1000!= 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; 
} 
+2

コードを投稿できますか? 「ラベルはすでに数百になっている」という意味ですか? – acrilige

+1

いくつかのコードを表示できますか? – Default

+0

私のコードを編集しました。 –

答えて

10

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

MSDN: Timer.Interval Property

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

4

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

timer.Elapsed += new EventHandler(TimerEventProcessor); 

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

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

'timer.Elapsed + = TimerEventProcessor;'で十分です。 – Default

+0

彼がSystem.Windows.Forms.Timerを使用している場合、Elapsedイベントはありません。 – nos

+2

これは別の 'Timer'クラスです。 'Tick'イベントと' Elapsed'イベントの両方を持つ 'Timer'クラスはありません。 – Guffa

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はしばしばにインクリメント。単にそれをマスクするだけですが、それを行う正しい方法です。

+1

少なくとも、' Now'ではなく 'UtcNow'を使用してください。しかし、それでもクロックが変わると問題になります。 – CodesInChaos

+0

おっと! @CodesInChaos私に思い出させるために感謝、固定。 – peterchen

関連する問題