2017-07-19 107 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'是否重新連接失敗'IsAvailableChanged'爲真? – 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是一個好習慣。

另外,看看異步/等待。

+0

我想讓用戶界面凍結,因爲用戶所做的很多事情都是定時的。我不喜歡的是,即使在我重新連接相機後,UI仍然保持凍結 – Flotolk

+1

根據它的實際情況,如果UI線程被阻止,事件不會觸發。您需要在等待而不是鎖定UI線程的同時以編程方式禁用UI。 –

+0

不要凍結UI,不要讓用戶做任何事情,但不要凍結。 –