1

我已经尝试过 Dispatcher timer,但它似乎无法正常工作。

我设置了滴答事件,每个滴答都会添加到一个滴答计数器,但它只是没有正确地完成工作。我也有一个秒表来计算它已经过了多长时间,而且数字不匹配。请让我知道什么样的解决方案可以每秒给我 192 个滴答声。

    Stopwatch sw = new Stopwatch();
    public DispatcherTimer dt = new DispatcherTimer();
    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromMilliseconds(1000/192);
    dt.Start();
    sw.Start();

void dt_Tick(object sender, EventArgs e)
{
    tick_textbox.Text = tick_counter.ToString();
    seconds_textbox.Text = sw.Elapsed.ToString();
    tick_counter++;
}

现在,我已将其降低到每秒 8 次,这应该可以解决分辨率问题,但是使用 TimeSpan.FromSeconds 和 TimeSpan.FromMilliseconds 的间隔会得到截然不同的结果:

    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromSeconds(2 / 16);
    dt.Start();

对比

    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromMilliseconds(2000 / 16);
    dt.Start();

这是什么原因?

4

1 回答 1

8

您要求每 5 毫秒发生一次事件,而 .NET 计时器在此分辨率下根本不可靠

http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=815

来自文章:

我从所有测试中得出的结论是,充其量,您可以指望计时器在其目标时间的 15 毫秒内滴答作响。计时器在其目标时间之前滴答作响是很少见的,而且我从未见过它提前超过一毫秒。最坏的情况似乎是计时器将在目标时间的 30 毫秒内滴答作响。通过取您想要的目标频率(即每 100 毫秒一次),四舍五入到 15 的下一个倍数,然后加上 15 来计算最坏的情况。因此,如果没有非常重的 CPU 负载会阻止正常处理,则 100 ms 计时器将滴答作响每 99 到 120 毫秒一次。

使用这些计时器,您绝对无法获得比 15 毫秒更好的分辨率。如果您希望某些事情比这更频繁地发生,您必须找到不同的通知机制。没有 .NET 计时器对象会这样做。

多种方法可以获得此分辨率,但它们通常涉及为高频定时应用程序设计的特定硬件和驱动程序互操作的事件。在使用声光调制器、激光源和 CCD 之前,我已经这样做了。

于 2013-05-16T17:27:15.117 回答