5

私は Kinect に取り組んでいますが、散発的に Kinect によって Visual Studio がクラッシュします。

kinectSensor.Start()デバッグ後にメソッドを呼び出すと、 Kinect が既に別のプロセスで使用されていることがわかりました。

しかし、Kinect を使用している他のプロセスはありません。 朝、マシンを起動してアプリを起動した後、一度発生しました。しかし、ほとんどの場合、Kinect アプリを (VisualStudio 2010 のデバッグ モードで) 起動したときに発生し、アプリケーションを停止し、コードを変更した後、アプリを再起動しましたが、そのときは機能しませんでした。上記の例外と 2 秒後に Visual Studio がクラッシュします。

さらに、Kinect が既に実行されているかどうかを確認しますが、そうではありません (デバッグ中の Kinect センサーの状態の下)。

Kinect センサーの状態 (デバッグ モード)

何よりも奇妙なことは、数週間は問題なく動作する場合があり、その後、アプリを 2 回または 3 回起動するたびに 2 日間動作することです。

この件に関して私が見つけた唯一の解決策は、非常によく似た問題を抱えている一人の男からのものです(インターネット上で唯一の人ですか?):Imad Elayyan

Process Explorerを起動すると、まったく同じ USB ポート処理の問題 (写真に表示) が見つかりました。これは、アプリを閉じても終了しないミュータント プロセスです。

Kinect の USB ハンドルのミュータント プロセス

しかし、彼の解決策は実際には長期的な解決策ではありません。ミュータントを手動で強制終了し、VisualStudio を再起動する必要があります。時々、朝にVSを20回再起動する必要があります...

USBポートのハンドルを(コードで?)適切に閉じる方法はありますか?アプリを閉じると、そのハンドルが終了し、VSがクラッシュしなくなりますか?

どんな助けでもありがたいです、それは本当に私を困惑させ、それは私を夢中にさせます.

追加情報:

SDK1.5 + Kinect for Windowsを使用していますが、SDK1.0 + Kinect XBox360 でも同様でした。

私はすでにVSの別のインスタンスでVSをデバッグしようとしています。

4

3 に答える 3

0

わかりました、気遣ってくれてありがとう。問題の原因を突き止めたと思いますが、まだハンドル ポートの説明が不足しています。

事実:

  1. 私のソリューションには 3 つのプロジェクトがあり、2 つのクラス ライブラリ があります。Kinect.dll これらは、デバイスへの接続を作成し、ジェスチャ認識部分とカーソルの作成を処理します。KinectControls.dll カーソルと対話できるコントロール (ボタン、ボーダー、チャート 3D...) を作成します。そしてテストプロジェクト。

  2. Kinect.dll は、Kinect のイベント + いくつかのカスタム イベントを起動します: ColorFrameReady, DepthFrameReady, GestureRecognised...

  3. ほとんどのイベントはアセンブリの内部にありますが、外部のクラスから見えるものもあります。

  4. 登録された各イベントは登録されていません (またはそう思っていました)。

  5. Kinect 関連のクラスのファサード パターンを実装しました。KinectFacadeKinectStopには、接続を閉じてイベントの登録を解除するメソッドがあります。

問題の原因:

アプリケーションがシャットダウンしているときに、Application.Current.Shutdown()KinectStop を呼び出したメソッドが Kinect を停止し、アセンブリ内のハンドラーを登録解除しました。しかし、外部アセンブリでは、Kinect の終了後に登録解除が呼び出され (登録解除も呼び出された場合Application.Current.Shutdown()でも)、「基本/通常」エラーが発生しました。そのため、登録解除を削除しました。

Kinect イベントの登録を解除せず、Kinect が閉じる (KinectSensor.stop()メソッドが呼び出される) と、アプリケーションが閉じられてスレッドが終了しても、(散発的に) USB ハンドルが保持されます!! その後:アプリケーションを再度開く方法がなく(クラッシュ)、最終的にVisual Studioを閉じようとするとクラッシュします(私の質問で説明したように)。Kinect.Start()

私が見つけた解決策

KinectStop()呼び出されると、Kinect を閉じる前にタイマーを使用して、外部アセンブリのすべてのクラスがイベントの登録を解除できるようにします。

さらに、今後は外部クラスから「通常の」イベントは利用できません。ファサードはこれらのイベントを処理し、外部から利用できるFastSmartWeakEventを発生させます。それはメモリリークを解決し、状況によっては私の問題を解決することもできます.

それ以来、USB ポートの処理は維持され、Visual Studio はクラッシュしなくなりました。

概要

問題の根源とそれを回避するための解決策を見つけました。これが同様の問題を抱えている人に役立つことを願っています。

ただしKinectSensor.Stop()、アプリケーションを閉じたり、SDK からメソッドを呼び出したりしても、すべてのイベント ハンドラー/スレッド/プロセス/ポート ハンドルが閉じられない理由はまだわかりません。また、Visual Studio を閉じると、以前のいずれかがまだ実行されている場合でもクラッシュするのはなぜですか?

誰かが提案を持っている場合、それは歓迎されますか?

于 2012-07-09T08:31:04.120 に答える
0

Kinect が USB 3.0 ではなく USB 2.0 ポートに接続されていることを確認してください。

Microsoft Kinect は USB3.0 をサポートしておらず、Kinect で使用するとあらゆる種類の異常な動作が発生します。

私はあなたと同じ散発的な問題の多くを経験していましたが、私のマシンで数少ない USB2.0 ポートの 1 つを使い始めたときに問題は解決しました。

于 2013-08-14T04:00:49.180 に答える
-2

Windowsコライダーを試してください。それはあなたの問題を簡単に解決します。

于 2012-07-06T12:28:04.893 に答える