2017-07-19 16 views
0

私はKinectを使用していますが、たいていはプログラムの途中でシャットダウンし、あらゆる種類のエラーを引き起こします。この問題は修正されていないため、Kinectがこれを行うたびに一時停止するようにプログラムを設定したいと考えています。カメラの再接続を待つC#

public ManikinTrackingManager() 
    { 
     KinectSensor.GetDefault().IsAvailableChanged += MainWindow_IsAvailableChanged; 
    } 
    private bool kinnected = true; 
    private void MainWindow_IsAvailableChanged(object sender, IsAvailableChangedEventArgs e) 
    { 
     if (e.IsAvailable == true) 
     { 
      SpeechSynthManager.SpeakAsync("Kinect has been found!"); 
      kinnected = true; 
     } 
     else 
     { 
      SpeechSynthManager.SpeakAsync("Your Kinect has been disconnected!"); 
      SpeechSynthManager.SpeakAsync("Please wait while I try to fix this problem!"); 

      kinnected = false; 
      waitForReconnect(); 
     } 
     SpeechSynthManager.SpeakAsync("CHANGED " + e.IsAvailable.ToString()); 
    } 

これは私が切断する必要があるものです。私は

void waitForReconnect() 
{ 
    while (kinnected == false) 
    { 
      Thread.sleep(500); 
    } 
} 

を言って、カメラが再接続されるまで待機するループ上のタイマーを使用しようとする場合は、しかし、その代わりにKinectが再接続されるまで一時停止のため、このコードは、ちょうど私のコンピュータ全体をフリーズします。もう何を試してみるべきですか?

+0

「IsAvailable」をtrueに再接続して再接続しないでください。 – stuartd

+0

再接続がIsAvailableChanged @stuartdトリガー – Flotolk

+0

@Flotolkをトリガーするかどうかわかりません、 'SpeakAsync'は' Task'を返しますか? – Nkosi

答えて

0

UIスレッドですべての操作を実行しているため、UIがフリーズします。 UIスレッドでThread.Sleepを呼び出すと、UIが完全にフリーズします。通常、別のスレッドで実行されます。

UIをフリーズしたい場合でも、別のスレッドでkinnected変数を更新する必要があります。

BackgroundWorker,Tasksなどの操作を実行してください。

Thread.Sleepの代わりにスレッドを同期するには、ManualResetEventまたは他の同期オブジェクトを使用します。 Thread.Sleepを避けることは良い習慣です。

また、async/awaitを調べてください。

+0

私はUIがフリーズしたい、ユーザーの多くのものは時間がかかるので。私が気に入らないのは、カメラを再接続しても、UIがフリーズしたままになることです。 – Flotolk

+1

UIスレッドがブロックされていると、どのようにインプリメントされるのでしょうか? UIスレッドをロックするのではなく、待機している間にUIをプログラム的に無効にする必要があります。 –

+0

これまでUIをフリーズしてはいけません。ユーザは何もすることはできませんが、フリーズしないでください。 –