微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#-时钟应用

我正在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);
        }
    }

但是我现在面临的问题是这段代码可能会跳过一分钟,请从性能的角度提出另一种使之平滑的方法.

解决方法:

简单.当您将计时器设置为每秒关闭时,您会说:“请至少睡一秒钟,然后醒来并通知我”.实际上,您可能睡了更长的时间.另外,不同的时序API彼此之间存在时钟漂移.计时器所基于的时钟可能与DateTime.Now所基于的时钟不同.

这样想吧-假设您实际上每1.02秒唤醒一次.
因此,每隔50秒,您将跳过渲染中的一个节拍.例如,您将从“ 49.98”(渲染为“ 49”)醒来,然后在下一个间隔“ 51.00”醒来.

一种简单的解决方法是休眠时间少于1秒.对于您的情况,我建议您在500-750毫秒之间休眠,而不是整整一秒.如果您在相同的第二时间间隔内醒来,则只需再次重新渲染一次即可.或作为一个简单的优化,当您已经醒来之后第二次计数自上次以来没有改变时,什么也不做.

尝试说:
   tmr.Interval = TimeSpan.FromMilliSeconds(500);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐