nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

加速度センサーとInvokeについての覚書

<はじめに>
WP7で加速度センサーを使ってみようと思います。Accelerometerのインスタンスを生成すると、CurrentValueChangedイベントとReadingChangedイベントがあるのですが、「ReadingChangedは古いよ!」って注意されるのでCurrentValueChangedにて実装します。

<プログラム>

public partial class MainPage : PhoneApplicationPage
{
    private Accelerometer acceleroter;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public MainPage()
    {
        InitializeComponent();

        acceleroter = new Accelerometer();

        acceleroter.TimeBetweenUpdates   = TimeSpan.FromMilliseconds(1000);
        acceleroter.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<AccelerometerReading>>(acceleroter_CurrentValueChanged);

        acceleroter.Start();
    }

    /// <summary>
    /// acceleroter変化時に呼び出されるメソッド
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void acceleroter_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
    {
        try
        {
            AccelerometerReading accelerometer = e.SensorReading;

            Vector3 acceleration = accelerometer.Acceleration;

            Debug.WriteLine("X:" + acceleration.X.ToString() + " Y:" + acceleration.Y.ToString() + " Z:" + acceleration.Z.ToString());
        }
        catch (Exception ex)
        {
            Dispatcher.BeginInvoke(() => this.textBlock1.Text = ex.Message);
        }
    }
}


<まとめ>
特にこれと言って難しいところはありませんでしたが、しいて挙げるとすればAccelerometerのイベントは別スレッドで発生するようなので、Invokeを使ってUIスレッドに処理を渡すところは気をつけないといけません。