当速度变慢时,通过观察stdout来进行分析是可以的 :) 这个:
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 足以发现它。
任何关于为什么会如此缓慢的想法都将不胜感激!
编辑:
我已经在 etl 跟踪文件中捕获了挂起,并在 Windows Performance Analyzer 中进行了分析。看起来 EnumDevices
最终调用 DInput8.dll!fGetProductStringFromDevice
,后者调用 HIDUSB.SYS!HumCallUSB
,后者调用 KeWaitForSingleObject
并等待。10 次中有 9 次(确切地说是 10 个样本中有 9 个),它会非常快速地返回(每个 324us),准备好的调用堆栈包含 usbport.sys!USBPORT_Core_iCompleteDoneTransfer
,后跟 HIDUSB.SYS!HumCallUsbComplete
,看起来相当正常。
ntkrnlmp.exe!KiTimerExpiration
而不是HIDUSB.SYS
函数。我猜这一切都表明HIDUSB.SYS驱动程序正在异步查询设备,超时时间为5秒,有时会失败并达到此超时。
我不知道这个故障是否与特定的任何一个设备相关(我有几个USB HIDs),或者它是否是随机的 - 这很难测试,因为它并不总是发生。再次强调,任何人可以给我的信息将不胜感激,尽管我不抱希望微软会在不同寻常的DirectInput处境下尽快修复这个问题!
也许我只能开始更早地异步初始化输入,并接受有时会出现5秒延迟的用户输入。