Утечка памяти джойстика SharpDX.DirectInput - PullRequest
0 голосов
/ 24 января 2020

Я использую 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;
   }
}

}
...