5

我正在尝试使用调度计时器测量按键事件之间经过的时间(以毫秒为单位),但是当声明调度计时器的间隔为 1 毫秒然后建立滴答事件时,它不会每 1 毫秒触发一次,而是在某个地方像 10- 100 毫秒(猜测)。如果此滴答事件未按时触发,我如何以毫秒为单位准确测量时间?我在 Silverlight 中执行此操作,似乎无法访问 System.Timers。System.Threading.Timer 似乎也是如此。

这是代码的基础知识:

public void StartTimer(object o, RoutedEventArgs sender)
{
    System.Windows.Threading.DispatcherTimer myDispatcherTimer = new  
    System.Windows.Threading.DispatcherTimer();
    myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); // 1 Milliseconds 
    myDispatcherTimer.Tick += new EventHandler(Each_Tick);
    myDispatcherTimer.Start();
}

// A variable to count with.
int i = 0;

public void Each_Tick(object o, EventArgs sender)
{
    i++;
}

public void keypress(object s, EventArgs args)
{
    label1.contents = i.ToString();
    i = 0;
}

有任何想法吗?

4

2 回答 2

5

改为启动秒表,每次按下键时,只需从最后经过的毫秒(您需要将其存储在变量中)中减去秒表的当前经过的毫秒。

    private Stopwatch _stopwatch;
    private int _lastElapsedMs;

    public void StartTimer(object o, RoutedEventArgs sender)
    {
        _lastElapsedMs = 0;
        _stopwatch = Stopwatch.StartNew();
    }

    public void keypress(object s, EventArgs args)
    {
        int elapsedMs = (int)_stopwatch.ElapsedMilliseconds;
        int currentElapsed = (elapsedMs - _lastElapsedMs);

        _lastElapsedMs = elapsedMs;

        label1.contents = currentElapsed.ToString();
    }
于 2010-11-23T00:45:37.200 回答
2

Silverlight 中的 System.Threading 计时器只能精确到大约 20 毫秒。通常,如果您需要更好的分辨率,您会需要一个多媒体计时器,但您不能直接在 Silverlight 中访问这些计时器。也就是说,通过一些重大的调整和权衡,我已经读到可以获得具有约 3ms 精度的 Silverlight 计时器。请参阅此处引用的文档:

http://blogs.msdn.com/b/nikola/archive/2009/08/19/exposed-5-methods-to-create-game-loop-which-is-the-best.aspx

请注意,我自己并没有测试所有这些替代方案,但它们值得研究。

另一种选择是最近引入的System.Diagnostics.Stopwatch类。不幸的是,这有时只是一个高分辨率计时器,具体取决于您运行的硬件。并且 MS 文档没有指定他们如何确定它是否是真正的高分辨率,因此您唯一的选择是检查 IsHighResolution 属性。

于 2010-11-23T00:46:28.043 回答