2013-04-22 12 views
7

Obecnie pracuję nad małym projektem obejmującym urządzenie Kinect z opakowaniem OpenNI C#. W przypadku tego projektu tworzona jest głębokość, obraz i węzeł użytkownika przy użyciu pliku konfiguracyjnego xml i metody Context.CreateFromXmlFile. Odrębny wątek rozpoczęty który ma bardzo prostą pętlę (na przykładzie UserTracker.net):Opakowanie OpenNI C#: WaitAnyUpdateAll timeout

private void RunThread() 
{ 
    while(true) 
    { 
     try 
     { 
      context.WaitAnyUpdateAll(); //context is an OpenNI context object. 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 

     //process some data 

    } 
} 

to działa dobrze przez jakiś czas, aż do otrzymania obrazu aparat nie zmienia. Po krótkiej chwili następujący wyjątek jest pokazany:

A timeout has occured when waiting for new data! 
    at OpenNI.Context.WaitAnyUpdateAll() 
    at <file described above> 

po to jest wyjątek wszystkie kolejne połączenia do context.WaitAnyUpdateAll rzuci tego samego wyjątku, niezależnie od tego, co jest wejście. Po chwili komunikat o błędzie zmienia się na:

OpenNI.StatusException: The server has disconnected! 
    at OpenNI.Context.WaitAnyUpdateAll() 
    at <file described above> 

Jak mogę sobie poradzić z brakiem nowych danych wejściowych za pomocą OpenNI? Rozumiem, że otrzymujemy wyjątek limitu czasu, gdy nie są dostępne żadne nowe dane, ale jak możemy odzyskać ten wyjątek?

Odpowiedz

5

Okazuje się, że problem polegał na tym, że nie użyłem niebezpiecznej pętli. Wygląda na to, że WaitAnyUpdateAll wymaga uruchomienia w niebezpiecznym kontekście, a ja tego nie zrobiłem. Dodanie niebezpiecznego słowa kluczowego do definicji funkcji rozwiązało problem.