Top > Kinect > KinectForWindowsSDK > Tips > ExceptionOccuredWhenKinectStopped
Last-modified: Wed, 10 Oct 2012 07:18:45 JST
Counter:2249 Today:2 Yesterday:1 Online:10
このエントリーをはてなブックマークに追加

KinectSensor.Stopの後、FrameReadyイベント内でExceptionが生じる問題の解決

 このページで取り扱う問題は「MSKinectSDKver1.6」時点で公式に確認される問題の様です。

 具体的に細かい仕様まで調査したわけではありません。公式SDK1.0に含まれるドキュメントの「Stop」「Dispose」の項目には仕様詳細記載されてないはずです。FrameReadyイベント内に限らず、「KinectSensor.Stop」の実行後に「KinectSensor」インスタンスが実行する特定のメソッドで同様の例外(Exception)が発生する可能性があります。

  • 実装環境はWindowsFormsとKinectForWindowsSDK1.0です。

問題の発生と解決

 次のソースコードのようにして、ウィンドウを閉じる際にKinectセンサを止めて終了しようとした所、「InvalidOperationExceptionはユーザー コードによってハンドルされませんでした。This API has returned an exception from an HRESULT: 0x80070015」というエラーが発生した。エラー発生個所は、「FrameReadyイベント」に登録したイベントハンドラの「KinectSensor.MapDepthFrameToColorFrameメソッド」の呼び出し箇所になっている。

【エラーが生じたときの実装】

        protected override void OnClosed(EventArgs e)
        {
            kinectSensor.Stop();
        }

 この問題は次の様に「Stop」直後に「Dispose」することで解決した。上記ソースコードの様なパターンで実行する際にブレークポイントを打って確認すると、処理が次のように流れているのが分かったためである。

  1. OnClosedイベントの発生(ウィンドウを閉じようとする)
  2. KinectSensorの停止(KinectSensor.Stopメソッドを呼び出す)
  3. FreamReadyイベントの処理(ハンドラが呼び出される)

【エラーを回避する実装】

        protected override void OnClosed(EventArgs e)
        {
            kinectSensor.Stop();
            kinectSensor.Dispose(); 
        }

なお「Dispose」の代わりに「kinectSensor = null」にすると、「NullReferenceException」が発生する。

Map…メソッドで発生する例外について

 MapSkeletonPointToClorメソッドなど名前が「Map…」で始まり、座標を変換するメソッドに発生するエラー(例外)について、「Kinect for Windows SDK」に付属されるドキュメントには次のようにあります。

  • This method may throw an UnauthorizedAccessException if the KinectSensor has unexpectedly gone away (such as if the sensor gets unplugged from the USB connector).

 簡単に翻訳すると次のようになります。

  • KinectSensorが予期せぬ原因で失われた場合(USBコネクタから抜かれる場合など)、このメソッドは「UnauthorizedAccessException」をスローすることがあります。

「UnauthorizedAccessException」はMSDNで次のようにあります。