Оболочка OpenNI C#: тайм-аут WaitAnyUpdateAll

В настоящее время я работаю над небольшим проектом, включающим Kinect с оболочкой OpenNI C#. Для этого проекта глубина, изображение и пользовательский узел создаются с использованием файла конфигурации xml и метода Context.CreateFromXmlFile. Запускается отдельный поток, выполняющий очень простой цикл (на примере UserTracker.net):

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

       //process some data

   }
}

Какое-то время это работает нормально, пока изображение, которое получает камера, не изменится. Через некоторое время отображается следующее исключение:

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

После создания этого исключения все последующие вызовы context.WaitAnyUpdateAll будут вызывать одно и то же исключение, независимо от входных данных. Через некоторое время сообщение об ошибке меняется на:

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

Как я могу справиться с отсутствием нового ввода с помощью OpenNI? Я понимаю, что мы получаем исключение тайм-аута, когда новые данные недоступны, но как мы можем восстановиться после этого исключения?


person Tiddo    schedule 22.04.2013    source источник


Ответы (1)


Оказывается, проблема была в том, что я не использовал небезопасный цикл. Похоже, что WaitAnyUpdateAll нужно запускать в небезопасном контексте, а я этого не делал. Добавление ключевого слова unsafe в определение функции решило проблему.

person Tiddo    schedule 25.04.2013