Я использую SharpDX.DirectInput версии 4.2.0 для подключения к джойстику. Всякий раз, когда я создаю новый экземпляр объекта Joystick, создается 36 экземпляров объектов Guid. Эти объекты закреплены ручками. Когда я вызываю метод Dispose для объекта Joystick, объекты Guid остаются. Есть ли что-то, что я делаю неправильно в моей процедуре очистки, или это ошибка в библиотеке SharpDX?
Ниже приведен мой код.
using SharpDX.DirectInput;
public class JoystickManager_c
{
private Thread mJoystickThread;
private Joystick mDevice;
private bool mShutdown;
public JoystickManager_c()
{
mShutdown = false;
mJoystickThread = new Thread(new ThreadStart(JoystickThread));
mJoystickThread.IsBackground = true;
mJoystickThread.Start();
}
public void Shutdown()
{
mShutdown = true;
while (mJoystickThread.IsAlive)
{
Thread.Sleep(10);
}
//Shutdown requested. Dispose of resources
UnloadJoystick();
}
private void JoystickThread()
{
while (!mShutdown)
{
DetectJoystick();
Thread.Sleep(25);
}
}
private void DetectJoystick()
{
bool joystick_connected = false;
JoystickState current_state = null;
int button_count = 0;
using (DirectInput input = new DirectInput())
{
DeviceInstance instance = input.GetDevices(DeviceClass.All, DeviceEnumerationFlags.AttachedOnly).FirstOrDefault(x => x.Type == DeviceType.Joystick || x.Type == DeviceType.Gamepad);
joystick_connected = instance != null
if (joystick_connected)
{
if (mDevice == null)
{
// This is where the 36 Guid references are created
mDevice = new Joystick(input, instance.InstanceGuid);
mDevice.SetCooperativeLevel(IntPtr.Zero, CooperativeLevel.NonExclusive | CooperativeLevel.Background);
foreach (DeviceObjectInstance i in mDevice.GetObjects(DeviceObjectTypeFlags.Axis))
{
mDevice.Properties.Range = new InputRange(-1000, 1000);
}
mDevice.Acquire();
Thread.Sleep(25); //small sleep to allow acquisition
}
mDevice.Poll();
Thread.Sleep(25); //small sleep to get polling results
current_state = mDevice.GetCurrentState();
button_count = mDevice.Capabilities.ButtonCount;
}
input.Dispose();
}
if (joystick_connected)
{
//Act on the current state
}
else
{
// Joystick was unplugged. Dispose of resources
UnloadJoystick();
}
}
private void UnloadJoystick()
{
if (mDevice != null)
{
mDevice.Unacquire();
// I would expect all resources associated with the SharpDX object be released here...
mDevice.Dispose();
mDevice = null;
}
}
}