大家好,我正在用 C# 编写一个应用程序,它从加速度计(在 wiimote 内部)获取数据,然后对其进行处理和绘制图形。我正在使用Brian Peek 的 Wiimote 库,所以我正在使用事件处理程序来获取数据:
void wiimote_WiimoteChanged(object sender, WiimoteChangedEventArgs e)
{
X = e.WiimoteState.AccelState.Values.X;
Y = e.WiimoteState.AccelState.Values.Y;
Z = e.WiimoteState.AccelState.Values.Z;
}
我想以 100Hz 的速率绘制/保存/处理数据,所以我创建了一个计时器对象(WiiTimer),将其“Tick Interval”设置为 10ms,然后在计时器的每个滴答声中存储/处理数据:
private void WiiTimer_Tick(object sender, EventArgs e)
{
//Signal Processing (Some median and low pass filtering etc.) Ive removed the code for that since it is irrelevant here
sw.WriteLine((X * 9.8).ToString() + ", " + (Y * 9.8).ToString() + ", " + (Z*9.8).ToString() );
//Write Processed Data to file
}
现在的问题是,数据实际上并没有以 100Hz 的频率保存,因为信号处理需要一些时间,所以计时器不能每 10 毫秒调用一次它的 OnTick 事件处理程序。因此,数据存储速率取决于您在机器上运行代码的速度、您运行的其他程序数量等。
我该如何解决这个问题?我曾想过在单独的线程上运行计时器,但这会导致其他问题,正如有人在此处的另一个问题上指出的那样:“您的计时器事件可能想要从另一个线程访问对象。但这样做会导致比赛条件。”
有任何想法吗?