2017-07-19 2 views
0

Ich arbeite mit der Kinect, und manchmal wird es Mitte Programm herunterfahren, wodurch alle Arten von Fehlern verursacht werden. Da dieses Problem nicht behoben werden kann, möchte ich mein Programm so einstellen, dass es angehalten wird, wenn Kinect dies tut.warten, bis Kamera wieder angeschlossen wird 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()); 
    } 

Das ist, was ich fangen muss trennen. Allerdings, wenn ich versuche, einen Timer auf einer Schleife zu verwenden, zu warten, bis die Kamera wieder angeschlossen wird, mit den Worten:

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

Doch statt pausieren, bis die Kinect wieder verbunden wird, dieser Code nur friert meinen ganzen Computer. Was sollte ich noch versuchen?

+0

Wird das erneute Verbindungsfeuer 'IsAvailableChanged' nicht erneut mit' IsAvailable' als wahr angezeigt? – stuartd

+0

Es sollte, aber ich bin mir nicht sicher, ob die Reconnect-Trigger IsAvailableChanged @stuartd – Flotolk

+0

@Flotolk, gibt 'SpeakAsync' 'Task' zurück? – Nkosi

Antwort

0

Die Benutzeroberfläche wird eingefroren, da Sie alle Ihre Vorgänge im UI-Thread ausführen. Und wenn Sie Thread.Sleep im UI-Thread aufrufen, wird die Benutzeroberfläche vollständig eingefroren. Normalerweise wird es im separaten Thread gemacht.

Auch wenn Sie UI einfrieren möchten, müssen Sie kinnected Variable in einem separaten Thread aktualisieren.

Verwenden Sie BackgroundWorker, Tasks oder etwas ähnliches, um Ihre Operationen auszuführen.

Um Threads anstelle von Thread.Sleep zu synchronisieren, verwenden Sie ManualResetEvent oder andere Synchronisationsobjekte. Das Vermeiden von Thread.Sleep ist eine gute Übung.

Schauen Sie auch in async/erwarten.

+0

Ich möchte die Benutzeroberfläche einfrieren, da viele Dinge, die der Benutzer tut, zeitlich festgelegt sind. Was mir nicht gefällt ist, dass die Benutzeroberfläche eingefroren bleibt, auch nachdem ich die Kamera wieder verbunden habe. – Flotolk

+1

Abhängig davon, wie es ist, können Ereignisse nicht ausgelöst werden, wenn der UI-Thread blockiert ist. Sie müssen die Benutzeroberfläche während des Wartens programmatisch deaktivieren, anstatt den UI-Thread zu sperren. –

+0

Frieren Sie die Benutzeroberfläche niemals ein, lassen Sie den Benutzer nichts tun, aber nicht einfrieren. –

Verwandte Themen