C# 时钟应用
我正在C#.Net中创建一个时钟应用程序。我有0-9之间每个数字的图像。我在主页构造函数中有一个计时器,它每秒钟都在滴答作响C# 时钟应用,c#,silverlight,C#,Silverlight,我正在C#.Net中创建一个时钟应用程序。我有0-9之间每个数字的图像。我在主页构造函数中有一个计时器,它每秒钟都在滴答作响 DispatcherTimer tmr = new DispatcherTimer(); tmr.Interval = TimeSpan.FromSeconds(1); tmr.Tick += new EventHandler(tmr_Tick); tmr.Start(); void tmr_Tick(object sender, EventArgs e) {
DispatcherTimer tmr = new DispatcherTimer();
tmr.Interval = TimeSpan.FromSeconds(1);
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();
void tmr_Tick(object sender, EventArgs e)
{
dt = DateTime.Now;
UpdateSecondsImages(dt);
}
private void UpdateSecondsImages(DateTime dt)
{
secondSource2 = dt.Second % 10;
secondDigit2.Source = digimgs[secondSource2];
if (secondSource2 == 0)
{
secondSource1 = dt.Second / 10;
secondDigit1.Source = digimgs[secondSource1];
}
if (secondSource1 == 0)
{
UpdateMinuteImages(dt);
}
}
但我现在面临的问题是,这段代码可能会跳过一秒钟。请从性能的角度提出另一种方法,使其平滑。简单。当你将计时器设置为每秒钟关闭一次时,你是在说:“请在醒来通知我之前至少睡1秒”。事实上,你可以睡更长的时间。此外,不同的定时API之间存在时钟漂移。计时器所基于的时钟可能与DateTime.Now所基于的时钟不同 这样想吧——假设你实际上每1.02秒醒来一次。 因此,每50秒,您将在渲染中跳过一个节拍。例如,您将在“49.98”(渲染为“49”)醒来,然后在“51.00”醒来 简单的解决方法是睡眠时间少于1秒。在你的情况下,我建议睡眠时间在500-750毫秒之间,而不是一整秒钟。如果在相同的秒间隔内醒来,则可以简单地再次重新渲染相同的时间。或者,作为一个琐碎的优化,当您已经发现第二个计数自上次以来没有改变时,什么也不做 试着说:
tmr.Interval=时间跨度(从毫秒开始)(500) 如果可以只在时钟可见时显示时钟,我建议使用事件处理程序。获取其中的当前时间并适当更新UI。这不仅可以消除错误,还可以让您渲染毫秒:) 我非常怀疑这种方法会影响性能(在我们的时代,cos()和sin()的速度非常快)。但即使它会(您正在渲染数千个时钟),您也不能在每一帧上更新UI
希望这能有所帮助。昨天,我们与Ball Watch USA发起了一场比赛,用Silverlight制作手表。我建议使用情节提要在1分钟内将秒针旋转360度,并将情节提要设置为永远重复。以下是一些链接: