C#连续/不间断地读取数据(来自第三方SDK)

本文关键字:第三方 SDK 数据 连续 不间断 读取 | 更新日期: 2023-09-27 18:05:12

简介:我正在开发使用运动跟踪器分析人类运动系统的软件。目前,我正在从xsens实现硬件,并使用他们的SDK从无线传感器接收数据。SDK提供了一个带有"getData"方法的COM接口,您可以调用该方法来接收当前可用的xyz轴数据(简化(。如果你不调用getData,你会跳过那个"节拍",这样你就会丢失数据,他们的硬件/SDK中没有缓存。

问题:我的问题是,我需要以至少75Hz的速率获取数据,最好是多一点,但75是可以接受的,但我目前正在迅速下降到每秒只有20个信号。。。如果我去掉处理位(见下面的示例(,我会得到完美的采样率,所以我认为要么是出队导致排队暂停。或者"繁重"的CPU负载导致所有线程等待。我不知道如何找出真正的原因,探查器(EQATEC(只是显示我的"GetData"方法在一段时间后需要更长的时间。

问题:实现这一目标的最佳技术是什么?为什么我的"读取"线程会被中断/阻塞?肯定有更多的情况下,人们需要在不被打断的情况下阅读某些内容,但我已经在谷歌上搜索了两周,显然我找不到正确的单词。

请告知。

感谢

使用多媒体计时器的简化代码示例,版本4(http://www.codeproject.com/Articles/5501/The-Multimedia-Timer-for-the-NET-Framework)和一个BackgroundWorker

public class Sample
{
  private MultiMediaTimer _backgroundGetData;
  private bool _backgroundGettingData;
  private BackgroundWorker _backgroundProcessData;
  private ConcurrentQueue<double> _acceleration = new ConcurrentQueue<double>();
  private void StartProcess()
  {
    if (_backgroundGetData == null)
    {
      _backgroundGetData = new MultiMediaTimer {Period = 10, Resolution = 1, Mode = TimerMode.Periodic, SynchronizingObject = this};
      _backgroundGetData.Tick += BackgroundGetDataOnTick;
    }
    _backgroundProcessData = new BackgroundWorker {WorkerReportsProgress = false, WorkerSupportsCancellation = true};
    _backgroundProcessData.DoWork += BackgroundProcessDataOnDoWork;
    _backgroundGetData.Start();
  }
  private void BackgroundProcessDataOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
  {
    double value;
    if (!_acceleration.TryDequeue(out value)) value = 0;
    //Do a lot of work with the values collected so far,
    //this will take some time and I suspect it's the cause of the delays?
  }
  private void BackgroundGetDataOnTick(object sender, EventArgs eventArgs)
  {
    if (_backgroundGettingData) return;
    _backgroundGettingData = true;
    //123 represents a value I am reading from the sensors using the SDK
    double value = 123;
    if (value == -1)
    {
      Thread.Sleep(5);
      continue;
    }
    _acceleration.Enqueue(value);
    if (_acceleration.Count < 5) continue;
    if (!_backgroundProcessData.IsBusy)
    {
      _backgroundProcessData.RunWorkerAsync();
    }
    _backgroundGettingData = false;
  }
}

C#连续/不间断地读取数据(来自第三方SDK)

我在这里看到问题

 _backgroundProcessDataThread.Start();
 while (!_backgroundProcessDataThread.IsAlive){}
_backgroundGetDataThread.Start();
while (!_backgroundGetDataThread.IsAlive) {}

好吧,你们可以看到这里有一个无限循环,第二个线程只有在第一个线程完成它的工作之后才开始。即完成第一线程。这绝不是一个理想的模式。

抱歉,我后来发现了问题。

问题是,_backgroundGetDataThread只有在_backgroundProcessDataThread完成其工作后才会启动。