我有一个Sensorlistener,它在每次事件发生时都运行“ onsensorchanged”方法。现在,我想知道此方法在10毫秒内执行的频率。
我有一个时间跨度(当前时间戳-以前的时间戳),当我的时间跨度(总毫秒数)小于10时应执行“ counter ++”。 不幸的是,我的计数器总是0。 我在onSensorChanged方法之外进行了初始化,因为它总是在每次该方法运行时初始化(到0)。
DateTime timestamp;
DateTime timestampAlt;
TimeSpan deltaT;
int counter = 0;
public void OnSensorChanged(SensorEvent e)
{
timestamp = System.DateTime.Now; //timestamp of now
deltaT = timestamp - timestampAlt; //delta of timestamp of event 1 and event 2
//if delta between two events happened before 10 milli sec past, ignore
if (deltaT.TotalMilliseconds <= 10 || deltaT.TotalMilliseconds <= -10) //deltaT.Seconds <= 0.01
{
counter++;
return;
}
Console.WriteLine(counter);
//if 10 ms past, our previous timestamp become the old
timestampAlt = timestamp;
}
答案 0 :(得分:0)
DateTime.Now
本身可能会花费太多时间,因此使用System.Diagnostics.Stopwatch
会更好。
类似这样的东西:
Stopwatch stopwatch = new Stopwatch();
int counter = 0;
public void OnSensorChanged(SensorEvent e)
{
if (!stopwatch.IsRunning)
{
// start the stopwatch
stopwatch.Start();
}
else
{
if (stopwatch.ElapsedMiliseconds <= 10)
{
counter++;
return;
}
}
Console.WriteLine(counter);
// 10ms passed, restart the stopwatch
stopwatch.Restart();
}
答案 1 :(得分:-4)
至于差异:DateTimes的准确性和准确性与远程不匹配。测试表明仅每10-20毫秒顶部更新一次。为了提高精度,您需要诸如StopWatch之类的东西。 https://blogs.msdn.microsoft.com/ericlippert/2010/04/08/precision-and-accuracy-of-datetime/
只要您保持20毫秒以上的时间,它就可以正常工作。
但是还有另一个问题:如果让它按自己喜欢的频率运行,可能会导致处理这些事件而使CPU超负荷,从而再也没有时间做其他事情了-包括绘制结果。我第一次涉足多线程时遇到了确切的问题-报告经常发生,主线程被事件处理覆盖,因此变得无响应。
您可能想制作一个采样代码,您可以在其中定义采样(和更新)速率小于GUI的限制。我编写了以下代码以在备用线程中运行:
integer interval = 20;
DateTime dueTime = DateTime.Now.AddMillisconds(interval);
while(true){
if(DateTime.Now >= dueTime){
//insert code here
//Update next dueTime
dueTime = DateTime.Now.AddMillisconds(interval);
}
else{
//Just yield to not tax out the CPU
Thread.Sleep(1);
}
}
您使用事件,因此可能拥有一个GUI,因此某些计时器可能会起作用。但是,即使那些也容易遇到微秒级精度的问题。