Иногда (примерно 50% пробегов) EnumDevices занимает 5-10 секунд, чтобы вернуться. Обычно это почти мгновенно. Я не мог найти никаких других сообщений о таком поведении.DirectInput8 EnumDevices иногда болезненно медленный
Когда вещи это медленно, это нормально профиль, наблюдая стандартный вывод :) Это:
std::cout << "A";
directInput8Interface->EnumDevices(DI8DEVCLASS_GAMECTRL, MyCallback, NULL, DIEDFL_ATTACHEDONLY);
std::cout << "C";
...
BOOL CALLBACK MyCallback(LPCDIDEVICEINSTANCE, LPVOID)
{
std::cout << "B";
return DIENUM_CONTINUE;
}
подвисает в произвольный момент через перечисляя устройства - иногда это будет до обратного вызова вызывается в все, иногда после пары, а иногда и после последнего вызова.
Это явно упрощенная часть кода; Я на самом деле с помощью входного OIS библиотеки (http://sourceforge.net/projects/wgois/), поэтому для связи смотрите полный источник здесь:
Там, кажется, не будет ничего особенно фруктовым там происходит, хотя, но, возможно, что-то в их инициализации может быть причиной - я не знаю достаточно о DI8, чтобы определить это.
Любые идеи о том, почему это может быть так медленно, будут очень благодарны!
EDIT:
мне удалось поймать вишу в файле трассировки ETL и анализируют его в ОС Windows Performance Analyzer. Похоже, что EnumDevices
созванивает до DInput8.dll!fGetProductStringFromDevice
, который вызывает HIDUSB.SYS!HumCallUSB
, который вызывает KeWaitForSingleObject
и ждет. 9 раз из 10 (буквально - на трассе есть 10 образцов), это очень быстро возвращается (324us каждый), при этом готовый столбец содержит usbport.sys!USBPORT_Core_iCompleteDoneTransfer
, а затем HIDUSB.SYS!HumCallUsbComplete
, что выглядит вполне нормально.
Но 1 раз в 10 это занимает почти ровно 5 секунд, чтобы вернуться. На готовом стоп-камере ntkrnlmp.exe!KiTimerExpiration
вместо функции HIDUSB.SYS
. Я предполагаю, что все это указывает на то, что драйвер HIDUSB.SYS запрашивает устройства асинхронно с таймаутом 5 секунд, а иногда он терпит неудачу и ударяет этот таймаут.
Я не знаю, связан ли этот сбой с каким-либо одним устройством (у меня есть несколько USB-HID), или если оно случайное - его трудно проверить, потому что это не всегда происходит. Опять же, любая информация, которую кто-либо может мне дать, будет оценена, хотя я не буду надеяться на то, что Microsoft исправляет это в ближайшее время, учитывая нечетную ситуацию, в которую входит DirectInput!
Возможно, мне просто нужно начать инициализацию ввода раньше, асинхронно, и принять, что иногда будет задержка на 5 секунд, прежде чем пользовательский ввод может произойти.
Очень интересно! Благодаря! Я так и не дошел до сути, и никогда не было этого на любой другой машине, поэтому я предположил, что это устройства с плохой эксплуатацией или что-то в этом роде, и ваш отчет предлагает то же самое! Приятно знать, что я не единственный, на кого это влияет! –