1

私はこれについてかなりイライラしています..

呼び出されたタイマーとtimer1テキスト ボックスが呼び出され、タイマー ティックと呼ばTimeElapsedTextBoxれるdouble変数がテキスト ボックスTimeTakenToFinish に 1 秒 (1000 ミリ秒) ごとに刻み込まれているため、次の形式で時間を表示します。

Seconds.PartsOfSecond

Tick イベントは次のとおりです。

private void timer1_Tick(object sender, EventArgs e)
{
  TimeTakenToFinish += (double)timer1.Interval / 10000;
  TimeElapsedTextBox.Text = TimeTakenToFinish;
}

実際にはテキストボックスに希望どおりに表示されていますが、適切にカウントされていません..つまり、実際の秒未満でカウントされています..

これを修正する方法を教えてください..

4

2 に答える 2

8

ここでの問題は、OS の動作方法に対する誤解です。確かに、間隔を に設定することはでき1000msますが、実際に 1 秒ごとにカチカチ音をたてるとは期待できません。ハード (またはソフト) リアルタイム オペレーティング システムではなく、Windows でコードを実行しています。

余談ですが、タイマーの分解能には限りがあり、現在のところ、システム タイマーの精度 (おそらく約 15 ミリ秒) に制限されていることも知っておく必要があります。

そのような環境では、コードが決定論的に実行されるとは期待できません。いつでも、OS は先制的に CPU からユーザーを追い出し、別のタスクの作業を開始できます。

お願いしたいのですが、あなたが望む精度を得ることはできません。実際に必要ですか?おそらくそうではありませんが、ここで実際に何を達成しようとしているのかを教えてくれなかったので、誰が知っていますか?

また、これは間違っています:

TimeTakenToFinish += (double)timer1.Interval / 10000;

IntervalTickタイマーがイベントを起動する頻度を大まかに伝えるために使用されるプロパティです。1000.0 / 10000実際には何も測定していません。毎回カウンターに追加しているだけかもしれません。

さらに精度が必要な場合StopWatchは、CPU の高性能タイマーを使用するクラスを使用してください (利用可能な場合)。タイマーを使用して、ストップウォッチの現在の経過値に基づいて UI を定期的に更新できます。

void timer1_Tick(...)
{
    var totalSeconds = _someStopwatch.ElapsedMilliseconds / 1000.0;
    TimeElapsedTextBox.Text = totalSeconds.ToString();
}
于 2012-07-21T00:02:31.943 に答える
0

タイマーを使用する代わりに、DateTime.Now を使用して開始時刻を記録し、開始時刻から現在の時刻 (DateTime.Now) を減算します。これにより、CPU パフォーマンスの影響をあまり受けない代わりにシステム クロックを使用するため、より正確なタイマーが得られます。

または、これを行う System.Diagnostics.Stopwatch を使用できます。

1 秒未満の間隔で通常のタイマーを使用して、時間を表示するラベルを更新することもできます。

于 2012-07-21T00:04:23.650 に答える