【问题标题】:Need a reliable timer to fire an event 192 times per second [duplicate]需要一个可靠的计时器来每秒触发一个事件 192 次 [重复]
【发布时间】:2013-05-16 17:21:22
【问题描述】:

我已经尝试过调度程序计时器,但它似乎无法正常工作。

我设置了滴答事件,每次滴答都会添加到一个滴答计数器,但它只是没有做正确的工作。我也有一个秒表来计算它已经过了多长时间,而且数字不匹配。请让我知道什么样的解决方案可以每秒给我 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();

这是什么原因?

【问题讨论】:

  • 是要求事件每秒触发 192 次,还是每 1/192 秒触发一次?如果是前者,那么您可以只跟踪每个 1 秒间隔的开始时间,并尽可能快地触发事件,直到触发 192。然后停止直到下一个 1 秒间隔开始。
  • 1000 不能被 192 整除。您可以获得的最接近(以及您当前正在执行的操作)是每秒 200 次。 (理论上)实现这一点的唯一方法是跳过刻度或使用可变间隔。即便如此,计时器在此分辨率下仍不准确。
  • Windows 不是一个实时操作系统。 它是一个通用的商业应用操作系统。为工作使用正确的工具;如果您需要每秒精确地发生 192 次某事,请为自己准备一个专为此类任务而设计的操作系统。
  • 2 / 16 为 0,2.0 / 16 为 0.125

标签: c# timer


【解决方案1】:

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

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

来自文章:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多