2012-07-24 151 views
1

場景: 在Winform應用程序(C#)中,我有一個Datagridview,其中必須以格式「mm:ss」顯示4個倒數計時器。 時間間隔必須爲1000ms。計時器需要更多時間

我正在計數system.timers.timer過去的事件中的計時器。

在所有4個計時器中,我開始從2分鐘(02:00)開始倒計時。

問題: 需要更多時間(125秒)超過2分鐘,才能達到00:00。 類似地,持續4分鐘需要7-10(247-250)秒才能到達00:00

+2

Windows不是實時操作系統 – 2012-07-24 16:37:14

回答

2

系統上的定時器有點不準確。更好的系統通常提供更好的定時器,但即使是最好的系統也有滑動。

您還需要記住,您的進程在100%的時間內不會處於「完全控制」狀態,有時會被推入後臺並與其他應用程序共享處理器,盡最大努力跟蹤時間。

你可能想要的是C#中的高精度定時器(又名秒錶)。有關更多信息,請參閱This threadThis article on selecting timer mechanisms

0

如果您需要該類型的時間分辨率(即實際時鐘或倒數計時器),則應使用實時時鐘。

您仍然使用具有亞秒分辨率的定時器足夠頻繁地觸發以用於顯示目的,但是您不會將這些時間加起來,而是使用實時時鐘來獲取實際的經過時間(DateTime.Now - startTime)。

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