2012-06-29 24 views
5

Estoy trabajando en el Kinect, y esporádicamente el Kinect hace Visual Studio Crash.¿Cómo cerrar el asa del puerto USB de Kinect para evitar el bloqueo de VisualStudio?

está sucediendo cuando llamo el método kinectSensor.Start() después de depurar descubrí que la Kinect ya está en uso en otro proceso.

¡Pero ningún otro proceso está utilizando el Kinect! Ocurrió una vez en la mañana después de iniciar mi máquina y ejecutar la aplicación. Pero la mayoría de las veces ocurre cuando inicio la aplicación Kinect (en el modo de depuración en VisualStudio 2010), detengo la aplicación y después de modificar el código relanzo la aplicación y esa vez no funciona, he obtuvo la excepción anterior y después de 2sec Visual Studio se bloquea.

Además puedo comprobar si el Kinect ya está en ejecución y esto no es el caso (por debajo del estado del sensor Kinect durante la depuración):

state of kinect sensor (debug mode)

La cosa más rara por encima de todo, es que a veces funciona bien por semanas, y luego hace eso durante dos días cada dos/tres lanzamientos de la aplicación.

La única solución que encontré sobre el tema es de un tipo con un problema muy similar (el único en el Internet?): Imad Elayyan

Cuando inicio Process Explorer me encontré con el mismo problema de manejo de puerto USB (que se muestra en la foto), un proceso mutante que no finaliza cuando cerramos la aplicación.

mutant process for the USB handle of the Kinect

Pero su solución es realmente no una solución a largo plazo: tengo que matar manualmente el mutante y volver a empezar VisualStudio. A veces tengo que reiniciar VS 20 veces en la mañana ...

¿Hay alguna manera de cerrar correctamente el identificador del puerto usb (en el código?) Para que cuando cierre la aplicación termine ese identificador y no hace que VS se bloquee más?

Cualquier ayuda sería apreciada, realmente me desconcierta y me vuelve loco.

Información adicional:

estoy usando el SDK1.5 + Kinect para Windows pero también fue el caso con el SDK1.0 + Kinect Xbox360

tengo ya intentamos depurar VS con otra instancia de VS.

+0

Esto suena como un error de SDK, o algo que el equipo de SDK debería abordar al menos. ¿Puedes informar esto al equipo del proyecto de alguna manera? Desafortunadamente no lo veo en https://connect.microsoft.com/ – Rup

+0

No encontré cómo contactarlos tampoco. Probé tu enlace y el sitio web oficial de Kinect para Windows (desarrollador => Obtener soporte técnico), pero me redireccionaron a XBox en vivo y luego no puedo encontrar cómo abordar mi problema. Volveré a buscar ... – astreal

+0

También hay [su twitter] (https://twitter.com/KinectWindows), y sus [foros de MSDN] (http://social.msdn.microsoft.com/Forums/en- US/category/kinectsdk) - pero no he tenido mucha suerte en informar errores en los foros de Microsoft: -/ – Rup

Respuesta

0

Ok chicos, gracias por su cariño. Creo que encontré el origen de mi problema pero Todavía me falta una explicación para el puerto del controlador.

Datos:

  1. tengo 3 proyectos en mi solución, dos clases de biblioteca: Kinect.dll que se crea la conexión con el dispositivo, manejar la parte recognitionj gesto y la creación cursores. KinectControls.dll que crean controles (botón, borde, gráfico 3D ...) que pueden interactuar con los cursores. Y un proyecto de prueba.

  2. Kinect.dll lanzan el caso de que el Kinect + algún evento personalizado: ColorFrameReady, DepthFrameReady, GestureRecognised ...

  3. La mayoría de los eventos son internos en la asamblea, pero algunos son visibles desde fuera clases

  4. Cada evento registrado no está registrado (o eso creía yo).

  5. Implementé facade pattern para las clases relacionadas con Kinect . KinectFacade posee un método KinectStop que cierra la conexión y anula el registro de eventos.

Raíz del problema:

Cuando la aplicación estaba cerrando, el método Application.Current.Shutdown() llamado KinectStop que detuvo el Kinect y los no registrados el controlador en el conjunto. Pero en los ensamblajes externos se llamó al desregistro después de que se cerró el Kinect (incluso si se llamó también al registro fuera de registro en Application.Current.Shutdown()) lo que condujo a un error "básico/habitual". De modo que eliminé la anulación de registro.

Cuando no lo hace anular el registro del evento Kinect y Kinect cierra (KinectSensor.stop() método llamado), que (esporádicamente) mantiene el mango USB incluso si la aplicación está cerrada y cualquier tema terminado !! Y después de eso: No hay manera de volver a abrir la aplicación (Kinect.Start() cuelga) y finalmente cuando intenta cerrar Visual Studio se bloquea (como se explica en mi pregunta).

solución que he encontrado

Cuando KinectStop() se llama uso un temporizador antes de cerrar el Kinect de forma que ofrece clases en montajes exteriores pueden anular el registro de eventos.

Además, a partir de ahora, no hay eventos 'normales' disponibles en las clases externas: la fachada maneja esos eventos y aumenta FastSmartWeakEvent que están disponibles desde el exterior. Soluciona fugas de memoria y también podría resolver mi problema en alguna situación.

Desde entonces, no se controla el puerto USB y Visual Studio no se bloquea.

Resumen

he descubierto las raíces de mi problema y una solución con el fin de prescindir de ella. Espero que esto ayude a cualquiera con un problema similar.

Sin embargo I'still no entienden por qué cerrar la aplicación y/o llamando al método KinectSensor.Stop() desde el SDK does'nt cierre todas las manejador de eventos/Temas/procesos/manija puerto. ¿Y por qué cerrar Visual Studio hace que se bloquee incluso si uno de los anteriores sigue funcionando?

Si alguien tiene alguna sugerencia, será bienvenida?

-2

Pruebe el colisionador de Windows. Solucionará tu problema fácilmente.

+0

¿Qué es eso? No puedo ver nada obvio en Google. – Rup

0

Asegúrese de que el Kinect está enchufado a un puerto USB 2.0 y NO a USB 3.0.

Microsoft Kinect no es compatible con USB3.0 y todo tipo de resultados de comportamiento loco al usar uno con Kinect.

Estaba experimentando muchos de los mismos problemas esporádicos que usted y el problema se resolvió cuando comencé a usar uno de los pocos puertos USB2.0 en mi máquina.

Cuestiones relacionadas