我有一个关于计时器的基本问题。我的计时器表现得很奇怪。我试图让每毫秒发生一次滴答来更新我的数据。我似乎可以用秒来工作,但不是毫秒......
我正在使用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
也许我对此有太多了解......任何想法?
感谢所有帮助。
谢谢!
答案 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个按钮:Label1
,Label2
,Label3
和Button1
这是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毫秒,你会怎么做?)。