WPF计时器问题...无法获得正确的毫秒刻度

时间:2010-07-05 22:56:20

标签: wpf timer

我有一个关于计时器的基本问题。我的计时器表现得很奇怪。我试图让每毫秒发生一次滴答来更新我的数据。我似乎可以用秒来工作,但不是毫秒......

我正在使用WPF,我想知道为什么以下功能无法正常运行。

似乎“第二次”倒计时工作正常,但在使用相同的程序并编辑一个值时,它似乎没有正确“勾选”。

我正在尝试使用以下内容进行毫秒倒计时:

            //TimeSpan temp0 = new TimeSpan(0, 0, 0, 0, 1);
        CountdownTimer = new DispatcherTimer();
        CountdownTimer.Tick += new EventHandler(Countdowntimer_Tick);
        CountdownTimer.Interval = TimeSpan.FromSeconds(1.0);//temp0;

以上看起来似乎适用于“秒”倒计时,但我需要更高的精确度,所以我会做以下事情:

            //TimeSpan temp0 = new TimeSpan(0, 0, 0, 0, 1);
        IntroCountdownTimer = new DispatcherTimer();
        IntroCountdownTimer.Tick += new EventHandler(Countdowntimer_Tick);
        IntroCountdownTimer.Interval = TimeSpan.FromSeconds(0.001);//temp0;

这会给我们毫秒级的精度,但是,当我在我的程序中尝试这个时,速度要慢得多。有什么想法吗?

    void Countdowntimer_Tick(object sender, EventArgs e)
    {
        m_dIntroCountdown -= 1.0;
    }

ps:我相应地设置了“m_dIntroCountdown。如果我们以毫秒为单位,我将其设置为5000.0,如果在几秒钟内,5.0

也许我对此有太多了解......任何想法?

感谢所有帮助。

谢谢!

3 个答案:

答案 0 :(得分:5)

对于WPF可以处理的内容,1 ms的时间分辨率太精细了。即使在120 fps(高)下,您也只能获得8.3 ms的分辨率。要以1ms更新,您需要每秒渲染1000帧。这超出了任何现代系统的限制。甚至人眼也开始在~10ms左右开始失去运动的不连续变化。

你想要什么决议?如果您只是想跟踪时间,请使用System.Diagnostics.Stopwatch。它的分辨率约为10ns。

答案 1 :(得分:2)

这是C#的代码:

using System.Windows.Threading;


public partial class MainWindow
{

    DateTime Time = new DateTime();
    DispatcherTimer timer1 = new DispatcherTimer();

    private void dispatchertimer_Tick(object sender, EventArgs e)
    {
        TimeSpan Difference = DateTime.Now.Subtract(Time);
        Label1.Content = Difference.Milliseconds.ToString();
        Label2.Content = Difference.Seconds.ToString();
        Label3.Content = Difference.Minutes.ToString();
    }

    private void Button1_Click(System.Object sender, System.Windows.RoutedEventArgs e)
    {
        timer1.Tick += new System.EventHandler(dispatchertimer_Tick);
        timer1.Interval = new TimeSpan(0, 0, 0);


        if (timer1.IsEnabled == true)
        {
            timer1.Stop();
        }
        else
        {
            Time = DateTime.Now;
            timer1.Start();

        }
    }

以下是如何操作:

添加3个标签和1个按钮:Label1Label2Label3Button1

这是Vb(Visual Basic)的代码:

Imports System.Windows.Threading

Class MainWindow

Dim timer1 As DispatcherTimer = New DispatcherTimer()
Dim Time As New DateTime

Private Sub dispatchertimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
    Dim Difference As TimeSpan = DateTime.Now.Subtract(Time) 
    Label1.Content = Difference.Milliseconds.ToString
    Label2.Content = Difference.Seconds.ToString
    Label3.Content = Difference.Minutes.ToString
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    AddHandler timer1.Tick, AddressOf dispatchertimer_Tick
    timer1.Interval = New TimeSpan(0, 0, 0)


    If timer1.IsEnabled = True Then
        timer1.Stop()
    Else
        Time = DateTime.Now
        timer1.Start()

    End If
End Sub
End Class

答案 2 :(得分:0)

DispatcherTimer不是一个高精度计时器 - 它是一个适合UI工作的低精度低精度计时器(人们不会注意到100毫秒的延迟)。

每1ms执行一次代码的高精度定时器很难实现,甚至不可能实现(如果系统中的某些其他进程进入100%CPU而你的进程运行时间不超过1ms,你会怎么做?如果时间执行的代码必须从页面文件重新加载并且需要超过1毫秒,你会怎么做?)。