Мой код в основном следует Рекомендации MS о том, как найти и получить дескриптор коллекции HID. Затем я использую этот дескриптор для получения соответствующих предварительно проанализированных данных, из которых я получаю нужные мне данные.
В настоящее время мой код делает это каждый раз, когда пользователю необходимо получить данные (например, количество кнопок, ось мин / макс). Это медленный бизнес. Профилировщик ясно говорит, что главный виновник SetupDiGetClassDevs () который кажется очень медленным.
Невозможно сохранить дескриптор (или я так думаю), поскольку он может заблокировать систему от внесения изменений, таких как удаление устройства или перестановка устройств. Мне все еще нужно посмотреть, что произойдет, если я оставлю дескриптор верхнего уровня открытым для всего сеанса.
Другой вариант, который я обдумываю, — сохранить предварительно проанализированные данные. MS умоляет нас выпустить его, вызывая HidD_FreePreparsedData (). Что произойдет, если мы этого не сделаем?
Последнее, о чем я думал, это ускорить SetupDiGetClassDevs (). Мое текущее использование:
HDEVINFO hardwareDeviceInfo =
SetupDiGetClassDevs (
&HidGuid,
NULL, // Define no enumerator (global)
NULL, // Define no
(DIGCF_PRESENT | // Only Devices present
DIGCF_DEVICEINTERFACE)); // Function class devices.
Будет ли он ускорен, если я изменил параметры?
Просто отпустите предварительно проанализированные данные, как только вы закончите с устройством. Если устройство удалено, чтение или запись на него не удастся, и вы можете обнаружить это, посмотрев на код ошибки, вызвав GetLastError()