2012-06-10 2 views
0

Мне нужно создать консольное приложение, которое использует Kinect, с Kinect SDK и C#. Поскольку это консольное приложение, я нашел опрос наилучшим способом получения кадров, которые мне нужно обработать. Мне нужно будет получить кадры с камеры глубины и камеры rgb, выполнить некоторую обработку затем в отдельных потоках (один для изображения глубины и один для изображения rgb) и дать пользователю выход для каждого из двух обработанных кадров. То, как я думал об этом, следующее:Опрос датчиков Kinect на консольном приложении

1 - создать 2 потока, первый - на методе опроса камеры rgb и выполнить обработку, второй - на методе, который опросает глубину камеры и сделать обработку

2 - Запуск темы

3 - ввод в то время как некоторые остановки условие цикла

4 - проверить отдельно, если каждый поток жив, если нет, то создать их снова и начать их снова

Я сделал тестовую программу, которая следует этим шагам, и она работает, но я не уверен, что это лучший способ сделать это. Моя тестовая программа

class Program 
{ 
    private static ClassExecutioner Executioner; 
    private static Class1 Cls; 

    static void Main(string[] args) 
    { 
     Executioner = new ClassExecutioner(); 
     Cls = new Class1(); 

     Thread fThread = new Thread(new ThreadStart(processA)); 
     Thread sThread = new Thread(new ThreadStart(processB)); 
     fThread.Start(); 
     sThread.Start(); 

     while (true) 
     { 
      if (!fThread.IsAlive) 
      { 
       fThread = new Thread(new ThreadStart(processA)); 
       fThread.Start(); 
      } 

      if (!sThread.IsAlive) 
      { 
       sThread = new Thread(new ThreadStart(processB)); 
       sThread.Start(); 
      } 
     } 

    } 
    static void processA() 
    { 
     String frameA = Cls.pollA(); 
     Executioner.CallA(frameA); 
    } 
    static void processB() 
    { 
     String frameB = Cls.pollB(); 
     Executioner.CallB(frameB); 
    } 
} 

Класс 1 Методы представляют собой опрос камер на Kinect

class Class1 
{ 
    private int a; 
    private int b; 

    public Class1() 
    { 
     a = 0; 
     b = 0; 
    } 

    public String pollA() 
    { 
     String frame = "this is " + a % 100; 
     a++; 
     return frame; 
    } 

    public String pollB() 
    { 
     String frame = "I am " + b % 100; 
     b++; 
     return frame; 
    } 
} 

Палач представляет методы, которые обрабатывают кадры, полученные от Kinect

class ClassExecutioner 
{ 

    public ClassExecutioner() 
    { 
    } 

    public void CallA(String frameA) 
    { 
     Random rand = new Random(); 
     int time = rand.Next() % 1000000000; 
     //'processing' - wait some time 
     for (int i = 0; i < time; i++) 
     { 
     } 
     // finishes the processing of the 'frame' from stream A 
     Console.WriteLine(frameA); 
    } 

    public void CallB(String frameB) 
    { 
     Random rand = new Random(); 
     int time = rand.Next() % 1000000000; 
     // 'processing' - wait some time 
     for (int i = 0; i < time; i++) 
     { 
     } 
     // finishes the processing of the 'frame' from stream B 
     Console.WriteLine(frameB); 
    } 
} 

Программа является очень просто, но хорошо иллюстрирует то, что я хочу делать с потоками Kinect. Проблема в том, что я не уверен, что это лучший способ сделать это, или даже если это будет вообще работать на практическом приложении Kinect. Имейте в виду, что на данный момент каждая обработка (глубина и rgb) не нуждается в информации от другой.

Заранее благодарен!

ответ

1

Возможно, было здорово изучить структуру ReactiveExtensions. Он имеет дело с потоками асинхронных событий очень чисто.

Вы можете написать LINQ для источников данных и сделать очень интересные составные операции.

http://msdn.microsoft.com/en-us/data/gg577609.aspx

Вы в основном будете иметь две IEnumerable последовательности (то, что цикл бесконечно), что выход из кадра в заданном интервале. Затем вы можете запросить эти последовательности с помощью Rx. RX обрабатывает все сложные проблемы с потоками для вас и делает ваш потребительский код чистым и простым.

Чтобы быть ясным, вы не хотите создавать новые потоки каждый раз. Вы можете создать два бесконечных перечисления, каждый из которых запускается в своем потоке и выводит результат на каждой итерации. Таким образом, они даже не «умирают»

+0

Nice! Я займусь этим. Одна из вещей, которые, по моему мнению, были не очень хороши в моем коде, - это процесс создания нового потока каждый раз, когда предыдущий поток умер, и то, что вы предложили, похоже, является хорошим способом справиться с этой проблемой. Благодаря! Любые другие предложения (и объяснения других возможных причин, по которым мой текущий код плох) будут оценены, хотя! –

+0

Только что нашел это: https://github.com/Aesir/ObservableKinect Звучит интересно –

Смежные вопросы