Stap 6: C# applicatie-Threading en XBox 360 Controller-Input
De eerste bit van software die ik schreef voor dit project was voor de XBox 360-controller (je hebt misschien gemerkt dat de oorspronkelijke naam van het Visual Studio-project heeft doorgevoerd in het einde!). De XBox controller code vindt u in het eerste deel van het bestand "Form1.cs". Zoals vermeld in de vorige stap, deze code werkt alleen als de Xinput dotnet wrapper is geconfigureerd (d.w.z. "XInputDotNetPure.dll" is toegevoegd als een verwijzing in het C#-project, en "XInputInterface.dll" is in de zelfde omslag zoals het .exe-bestand).
De code werkt door herhaaldelijk polling de controller om op te halen de status van de knoppen en de analoge besturingselementen. Als gevolg van deze verkiezingen, realiseerde ik me dat het programma meerdere threads, moeten zou om te kunnen werken op alle. Dit was een beetje een uitdaging, als ik niet had eigenlijk een multithread-toepassing vóór deze geschreven. Na het kijken naar enkele voorbeelden en tutorials, besloten heb ik dat er zou een draad van de hoofdtoepassing voor de grafische gebruikersinterface (GUI), een aparte thread voor het afhandelen van de XBox 360-controller, en diverse meer threads voor andere dingen. Meerdere threads toestaan dat al deze dingen om te werken in parallel, zonder enige merkbare vertraging in de GUI.
In de Xbox controller thread, is de status van de controller ondervraagden ongeveer 50 Hz, dus het is altijd zeer actuele gegevens. Deze controller-gegevens wordt ook weerspiegeld op de GUI, en knooppersen zijn oranje gemarkeerd. Om dit te doen, kruis-draad gegevens overdracht nodig waren. Ik gebruikt het concept van "delegates" om draden aan elkaar "beïnvloeden". U ziet ook een aantal "shared_..."-variabelen die binnen meerdere threads worden gebruikt.
Deze sectie van code heeft ook een teller die houdt van controller "frames". In het kader van mijn code verwijzen de frames naar wanneer de status van de controller ook daadwerkelijk is gelezen. De tellers "samplecount" en "oldsamplecount" worden gebruikt zodat lange knop indrukt correct worden afgehandeld. Als voorbeeld, heb ik sommige digitale knoppen toegewezen zodat één druk op een functie activeert, en de volgende pers die functie deactiveert. Als een lange druk is niet correct behandeld, zal het programma die functie in- en uitschakelen continu schakelen. De code behandelt een lange druk correct als één enkele pers door vergelijking van de waarde van oldsamplecount tegen samplecount. Als het verschil tussen de twee variabelen te klein is, wordt dit gedetecteerd als een lange druk op.