不用时间连续获取方法数据

时间:2013-11-07 10:11:56

标签: c# kinect propertychanged

我正在尝试从Kinects加速度计获取数据,但它没有更改通知事件,因此要获取数据,我现在正在使用while循环。有没有办法将AccelerometerGetCurrentReading()方法结果绑定到属性然后使用propertychanged事件或其他什么?

1 个答案:

答案 0 :(得分:3)

不确定

  • 创建一个实现INotifyPropertyChanged的类AccelerometerReader。
  • 添加一个属性,该属性代表您从加速度计读取的当前(最新)值。
  • 在属性设置器中,当值不同时,让属性触发PropertyChanged事件。
  • 当该类被实例化时,启动一个连续读取加速度计的任务,并在属性中设置该值。
  • 由于该值仅在更改时触发,因此只有在发生更改时才会通知任何观察者。
  • 在无限循环中添加延迟或添加计时机制以便每隔x毫秒读取一次是合理的。
  • 您可能希望让课程处于一次性状态,以便您可以停止任务或停止计时器。

使用循环的示例。一个简单的布尔值用于停止循环,布尔值在放置对象时设置。 警告:此代码尚未经过测试!

class AccelerometerReader: INotifyPropertyChanged, IDisposable {
    #region Constructor

    public AccelerometerReader() {
        new Task(ReadAccelerometer).Start();
    }

    #endregion
    #region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    void FirePropertyChanged(string propertyName) {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null) {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
    #region Properties

    int _value;
    public int Value {
        get { return _value; }
        set { 
            if (value != _value) {
                _value = value;
                FirePropertyChanged("Value");
            }
        }
    }

    #endregion
    #region Accelerometer reading

    bool _stopLoop = false;

    void StartReadLoop() {
        while (!_stopLoop) {
            Value = ReadAccelerometer();
            // TODO: Delay a little
        }
    }

    int ReadAccelerometer() {
        // TODO: Read from accelerometer...
    }

    #endregion
    #region IDisposable

    public void Dispose() {
        _stopLoop = true;

        // TODO: Add a proper IDisposable implementation
    }

    #endregion
}