C# 时钟应用

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) {

我正在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)
    {
        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度,并将情节提要设置为永远重复。以下是一些链接:


您使用的是WPF还是GDI?如果您使用GDI,那么我建议WPFI应该让计时器更频繁地中断,读取时间,而不是计算时间。Kenny,请您用一些代码示例向我简要介绍一下好吗?嗨,听起来不错。我也尝试过同样的逻辑,现在秒与秒之间没有跳跃,但两个连续数字之间的转换时间有时会有所不同。这也会消耗我的应用程序内存。因为这是一款手机应用程序,所以放弃memmory约束的成本太高了。你应该读一下Raymond Chen的文章,内容是关于为什么Windows没有显示托盘计时器的“秒”计数。这是您发布的一个很酷的链接,但我也看到应用程序显示秒数:-(测量滴答例行程序的运行时间,并将滴答率调整为略高于此值。如果滴答时间为3/4秒,则会出现这样的情况,即有时滴答例行程序会运行两次,有时只运行一次。改为尝试十分之一秒。这会影响电池寿命。内存使用都在映像存储中。您可以减少图像的数据大小或按需加载。手机闪存速度较慢,因此按需加载可能会重新引入抖动。如何使我的计时器与系统计时器(DateTime.Now)同步?