如何计算在10毫秒内调用方法的频率?

时间:2019-04-10 17:13:29

标签: c#

我有一个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;
}

2 个答案:

答案 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,因此某些计时器可能会起作用。但是,即使那些也容易遇到微秒级精度的问题。