Как да затворя манипулатора на USB порта на Kinect, за да предотвратя срив на VisualStudio?

Работя върху Kinect и от време на време Kinect прави Visual Studio Crash.

Това се случва, когато извикам метода kinectSensor.Start() след отстраняване на грешки установих, че Kinect вече се използва в друг процес.

Но никакви други процеси не използват Kinect! Случи се веднъж на сутринта след стартиране на моята машина и стартиране на приложението. Но през повечето време това се случва, когато стартирам приложението Kinect (в режим на отстраняване на грешки във VisualStudio 2010), спирам приложението и след известна модификация на кода стартирам отново приложението и този път то не работи, имам горното изключение и след 2 секунди Visual Studio се срива.

Освен това проверявам дали Kinect вече работи и това не е така (под състоянието на сензора Kinect по време на отстраняване на грешки):

състояние на kinect сензор (режим на отстраняване на грешки)

Най-странното нещо преди всичко е, че понякога работи добре в продължение на седмици, а след това го прави за два дни на всеки две/три стартирания на приложението.

Единственото решение, което намерих по темата, е от един човек с много подобен проблем (единственият в интернет?): Имад Елаян

Когато стартирам Process Explorer открих абсолютно същия проблем с USB порта обработка (показана на снимката), мутантен процес, който не се прекратява, когато затворим приложението.

мутантен процес за USB манипулатора на Kinect

Но неговото решение всъщност не е дългосрочно решение: трябва ръчно да убия мутанта и да рестартирам VisualStudio. Понякога трябва да рестартирам VS 20 пъти сутрин...

Има ли начин правилно да затворя манипулатора на usb порта (в код?), така че когато затворя приложението, той да прекрати този манипулатор и VS да не се срива повече?

Всяка помощ ще бъде оценена, това наистина ме озадачава и ме подлудява.

Допълнителна информация:

използвам SDK1.5 + Kinect за Windows, но така беше и с SDK1.0 + Kinect XBox360

Вече се опитах да отстраня грешки във VS с друг екземпляр на VS.


person astreal    schedule 29.06.2012    source източник
comment
Това звучи като грешка в SDK или нещо, което екипът на SDK трябва да реши най-малкото. Можете ли да докладвате това на екипа на проекта по някакъв начин? За съжаление не го виждам на connect.microsoft.com   -  person Rup    schedule 29.06.2012
comment
И аз не намерих как да се свържа с тях. Опитах вашата връзка и официалния уебсайт на Kinect за Windows (разработчик =› Получете техническа поддръжка), но съм пренасочен към XBox live и след това не мога да намеря как да реша проблема си. пак ще потърся...   -  person astreal    schedule 29.06.2012
comment
Има и техния Twitter и техния MSDN форуми - но аз самият нямах много късмет да докладвам за грешки във форумите на Microsoft :-/   -  person Rup    schedule 29.06.2012
comment
Как спирате приложението (наистина ли се изключва) - Нещо като Application.Current.Shutdown() трябва да убие всички свързани нишки.   -  person Kendall Trego    schedule 30.06.2012
comment
Използвам [code]Application.Current.Shutdown()[/code] и всъщност също използвам събитието [code]dispatcher_ShutdownStarted[/code] на главния прозорец, за да затворя манипулаторите на събития и други неща и в отстраняване на грешки режим, той преминава през този метод.   -  person astreal    schedule 02.07.2012
comment
@astreal - Актуализирайте въпроса си. Предоставете някакъв действителен код.   -  person Security Hound    schedule 06.07.2012


Отговори (3)


Добре, момчета, благодаря за грижите. Мисля, че открих източника на моя проблем, но все още нямам обяснение за порта на манипулатора.

Факти:

  1. Имам 3 проекта в моето решение, две библиотеки с класове: Kinect.dll, които създават връзката към устройството, обработват частта за разпознаване на жестове и създаването на курсори. KinectControls.dll, които създават контроли (бутон, рамка, 3D диаграма...), които могат да взаимодействат с курсорите. И тестов проект.

  2. Kinect.dll стартира събитието на Kinect + някои персонализирани събития: ColorFrameReady, DepthFrameReady, GestureRecognised...

  3. Повечето от събитията са вътрешни в сборката, но някои се виждат от външни класове.

  4. Всяко регистрирано събитие е нерегистрирано (или поне така си мислех).

  5. Приложих модел на фасадата за свързаните с Kinect класове. KinectFacade притежава KinectStop метод, който затваря връзката и дерегистрира събития.

Коренът на проблема:

Когато приложението се изключваше, методът Application.Current.Shutdown(), наречен KinectStop, който спря Kinect и нерегистрирания манипулатор в сборката. Но във външните модули дерегистрацията беше извикана след затваряне на Kinect (дори ако дерегистрацията беше извикана и на Application.Current.Shutdown()), което доведе до „основна/обичайна“ грешка. Така че премахнах отписването.

Когато не отмените регистрацията на събитието Kinect и Kinect се затвори (KinectSensor.stop() извикан метод), той (спорадично) запазва USB манипулатора дори ако приложението е затворено и всяка нишка е прекратена!!< /strong> И след това: Няма начин да отворите отново приложението (Kinect.Start() се срива) и накрая, когато се опитате да затворите Visual Studio, то се срива (както е обяснено в моя въпрос).

Намерих решение

Когато се извика KinectStop(), използвам таймер, преди да затворя Kinect, така че всеки клас във външни сборки да може да дерегистрира събития.

Освен това отсега нататък няма налични „нормални“ събития от външните класове: фасадата обработва тези събития и повишава FastSmartWeakEvent, които са достъпни от външния свят. Разрешава изтичане на памет и може да реши проблема ми в някаква ситуация.

Оттогава USB портът, който не се обработва, се запазва и Visual Studio вече не се срива.

Резюме

Намерих корените на моя проблем и решение, за да го заобиколя. Надявам се това да помогне на всеки с подобен проблем.

Въпреки това все още не разбирам защо затварянето на приложението и/или извикването на метод KinectSensor.Stop() от SDK не затваря всички манипулатори на събития/нишки/процеси/манипулатор на порт. И защо затварянето на визуално студио води до срив, дори ако един от предишните все още работи?

Ако някой има предложение ще бъде добре дошло?

person astreal    schedule 09.07.2012

Уверете се, че Kinect е включен в USB 2.0 порт, а НЕ в USB 3.0.

Microsoft Kinect не поддържа USB3.0 и всички видове лудо поведение са резултат от използването на такъв с Kinect.

Изпитвах много от същите спорадични проблеми като вас и проблемът беше разрешен, когато започнах да използвам един от малкото USB2.0 портове на моята машина.

person jezpez    schedule 14.08.2013

Опитайте Windows Collider. Лесно ще реши проблема ви.

person hellzone    schedule 06.07.2012
comment
Какво е това? Не виждам нищо очевидно в Google. - person Rup; 06.07.2012