1

シナリオ:Winformアプリケーション(C#)で、「mm:ss」の形式で4つのカウントダウンタイマーを表示する必要があるDatagridviewがあります。時間間隔は1000msでなければなりません。

system.timers.timerの経過イベントでタイマーをカウントダウンしていました。

4つのタイマーすべてで、2分(02:00)からカウントダウンを開始します。

問題:00:00に到達するには、2分よりも時間がかかります(125秒)。同様に、4分間、00:00に到達するまでにさらに7〜10(247〜250)秒かかります。

4

3 に答える 3

2

システムのタイマーはやや不正確な獣です。より良いシステムは一般により良いタイマーを提供しますが、最高のシステムでさえ滑りがあります。

また、プロセスが100%「フルコントロール」になるわけではないことも覚えておく必要があります。プロセスはバックグラウンドにプッシュされ、他のアプリケーションとプロセッサを共有する必要があるため、最善を尽くします。時間を追跡します。

おそらく必要なのは、C#の高精度タイマー(別名ストップウォッチ)です。詳細については、このスレッドタイマーメカニズムの選択に関するこの記事を参照してください。

于 2012-07-24T16:32:08.270 に答える
0

そのタイプの時間分解能(つまり、実際のクロックまたはカウントダウンクロック)が必要な場合は、リアルタイムクロックを使用する必要があります。

表示目的で十分な頻度で起動するために、1秒未満の解像度のタイマーを引き続き使用しますが、それらの時間を合計せずに、リアルタイムクロックを使用して実際の経過時間を取得します(DateTime.Now - startTime)。

于 2012-07-24T16:42:55.203 に答える
0

まず、この小さなテストを実行して、ほぼリアルタイムでドリフトを確認する必要があります。72回のタイマー経過イベントの後に1秒が失われます(これは実際の作業がほとんどない場合です)。

using (var timer = new Timer(1000))
{
    var start = DateTime.Now;
    var i = 0;
    timer.Elapsed += (sender, args) => Console.WriteLine("{0} -> {1}", ++i, (DateTime.Now - start).TotalMilliseconds);
    timer.Start();
    Thread.Sleep(130*1000);
}

アプリがどれほど正確である必要があるかはわかりませんが、開始時間と現在のデルタを使用し、それを初期値から差し引いてタイマーをゼロにすることで、「十分に良い」ものを得ることができます。 このアプローチでは秒を失うことになり、秒を失う可能性があります@ダニ0:00を引き起こし-0:01ます。これを処理する必要があります。

var countdownSeconds = 120;
var startedAt = DateTime.Now;

var timer = new Timer(1000);    
timer.Elapsed += (sender, args) => Display(countdownSeconds - (int)((DateTime.Now - startedAt).TotalSeconds));
timer.Start();

//- be sure to dispose the timer
于 2012-07-24T16:51:31.420 に答える