【发布时间】: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