KinectSensor.Stopの後、FrameReadyイベント内でExceptionが生じる問題の解決
このページで取り扱う問題は「MSKinectSDKver1.6」時点で公式に確認される問題の様です。
- 参考URLと該当部の転載
- 1.6 SDK and Developer Toolkit Known Issues
- Calls to KinectSensor.Map and DepthImageFrame.Map may fail if you called KinectSensor.Stop already or removed the sensor while the application is running
問題の発生と解決
次のソースコードのようにして、ウィンドウを閉じる際に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」することで解決した。上記ソースコードの様なパターンで実行する際にブレークポイントを打って確認すると、処理が次のように流れているのが分かったためである。
- OnClosedイベントの発生(ウィンドウを閉じようとする)
- KinectSensorの停止(KinectSensor.Stopメソッドを呼び出す)
- 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で次のようにあります。
- オペレーティング システムが I/O エラーまたは特定の種類のセキュリティ エラーのためにアクセスを拒否する場合、スローされる例外。