Paso 6: C# aplicación Threading y el XBox 360 controlador entrada
El primer bit de software que escribí para este proyecto era para el controlador de XBox 360 (usted puede haber notado que el nombre original del proyecto de Visual Studio ha desarrollado a través de hasta el final!). Encontrará el código de controlador de XBox en la primera parte del archivo "Form1.cs". Como se mencionó en el paso anterior, este código sólo funciona si se ha configurado la envoltura de dotnet Xinput (es decir, como una referencia en el proyecto de C# se ha añadido "XInputDotNetPure.dll", y "XInputInterface.dll" está en la misma carpeta que el archivo .exe).
El código funciona varias veces la votación el controlador para recuperar el estado de los botones y controles analógicos. Debido a este sondeo, me di cuenta que el programa tendría varios subprocesos, para trabajar en todo. Esto fue un poco de un desafío, como en realidad no había escrito una aplicación de subprocesos múltiples antes de éste. Después de mirar algunos ejemplos y tutoriales, he decidido que habría un subproceso de aplicación principal de la interfaz gráfica de usuario (GUI), un subproceso independiente para manejar el controlador de XBox 360 y varios temas más para otras cosas. Varios subprocesos permiten todas estas cosas trabajar en paralelo, sin cualquier retraso sensible en la GUI.
En el subproceso de controlador de Xbox, el estado del controlador es encuestado a cerca de 50Hz, por lo que siempre tiene datos muy actuales. Datos de este regulador también se hizo eco en la GUI, y pulsar un botón se resaltan en color naranja. Para ello, entre subprocesos eran necesarias las transferencias de datos. Utilicé el concepto de "delegados" para permitir flujos que "afectan". También se dará cuenta de una serie de variables "shared_..." que se utilizan a través de varios subprocesos.
Esta sección del código también tiene un contador que sigue la pista de controlador "frames". En el contexto de mi código, los marcos se refieren a cuando el estado del controlador se ha leído. Los contadores "samplecount" y "oldsamplecount" se utilizan para que presiona el botón largo son manejados correctamente. Como ejemplo, he asignado algunos botones digitales, para que una prensa activa una función, y la prensa siguiente desactiva esa función. Si una pulsación larga no es manejada correctamente, el programa cambiará esa función enciende y apaga continuamente. El código maneja correctamente una pulsación larga como una sola vez comparando el valor de oldsamplecount contra samplecount. Si la diferencia entre las dos variables es demasiado pequeña, se detecta como una pulsación larga.