Как закрыть ручку USB-порта Kinect, чтобы предотвратить сбой VisualStudio?

Я работаю над Kinect, и время от времени Kinect приводит к сбою Visual Studio.

Это происходит, когда я вызываю метод 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
Также есть их твиттер и их форумы 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 не поддерживает USB 3.0, и все виды сумасшедшего поведения возникают при использовании его с Kinect.

Я сталкивался со многими из тех же спорадических проблем, что и вы, и проблема была решена, когда я начал использовать один из нескольких портов USB2.0 на моей машине.

person jezpez    schedule 14.08.2013

Попробуйте оконный коллайдер. Он легко решит вашу проблему.

person hellzone    schedule 06.07.2012
comment
Что это такое? Я не вижу ничего очевидного в Google. - person Rup; 06.07.2012