7

ときどき (実行の約 50% で)、EnumDevices が戻るのに 5 ~ 10 秒かかります。通常はほぼ瞬時です。この種の行動に関する他の報告は見つかりませんでした。

物事がこれほど遅い場合は、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/ ) を使用しているので、コンテキストについては、ここで完全なソースを参照してください。

http://wgois.svn.sourceforge.net/viewvc/wgois/ois/trunk/src/win32/Win32InputManager.cpp?revision=39&view=markup

そこには特にフルーティーなものはないようですが、初期化の何かが原因である可能性があります.DI8については、それを見つけるのに十分な知識がありません.

なぜこんなに遅いのかについてのアイデアは大歓迎です!

編集:

etl トレース ファイルでハングをキャッチし、Windows パフォーマンス アナライザーで分析しました。EnumDevices最終的に を呼び出し、 を呼び出し、DInput8.dll!fGetProductStringFromDeviceを呼び出しHIDUSB.SYS!HumCallUSB、 を呼び出しKeWaitForSingleObjectて待機するように見えます。10 回のうち 9 回 (文字通り - トレースには 10 個のサンプルがあります)、これは非常に迅速に返され (それぞれ 324us)、コールスタックの準備が整い、usbport.sys!USBPORT_Core_iCompleteDoneTransferその後に が続きHIDUSB.SYS!HumCallUsbCompleteます。これは非常に正常に見えます。

しかし、10 分の 1 の割合で、これが戻るのにほぼ正確に 5 秒かかります。準備中のコールスタックntkrnlmp.exe!KiTimerExpirationには、関数の代わりがありHIDUSB.SYSます。これはすべて、HIDUSB.SYS ドライバーが 5 秒のタイムアウトで非同期的にデバイスにクエリを実行していることを示していると思いますが、失敗してこのタイムアウトに達することがあります。

この障害が特定の 1 つのデバイスに関連しているのか (私はいくつかの USB HID を持っています)、それともランダムなのかはわかりません。常に発生するとは限らないため、テストするのは困難です。繰り返しになりますが、誰かが私に提供できる情報は大歓迎ですが、DirectInput が奇妙な状況にあることを考えると、Microsoft がすぐにこれを修正するという希望はありません!

おそらく、入力の初期化を早めに非同期で開始し、ユーザー入力が発生するまでに 5 秒の遅延が発生する場合があることを受け入れる必要があるでしょう。

4

7 に答える 7

7

私も主にエンドユーザーとしてこれに遭遇していましたが、何年もの間私を悩ませてきました。オープン ソース プロジェクトでこの問題に遭遇し、デバッグできるようになるまで、これがこの問題であることに気付きませんでした。

それは私の USB ヘッドフォン DAC (Massdrop の目的の DAC) であることが判明し、wdma_usb.inf_amd64_134cb113911feba4\wdma_usb.infデバイス インスタンス ID のドライバーをインストールUSB\VID_262A&PID_1048&MI_01\7&F217D4F&0&0001し、デバイス マネージャーのサウンド、ビデオ、およびゲーム コントローラーの下に次のように表示されますODAC-revB USB DAC。.USB Input DeviceHID-compliant consumer control device

HID エントリが何をするのかわかりませんが... それらが有効で、この DAC がオーディオ出力デバイスとして設定されている場合、IDirectInput8_CreateDevice と EnumDevices の両方が非常に遅くなります。「USB 入力デバイス」エントリを無効にしても悪影響はないようで、問題は完全に解決します。

DAC からのオーディオ出力を別のものに変更すると、奇妙なことに問題が解決しました。

これは、Gamepad Configuration ダイアログの joy.cpl が使用できなくなり、ハングアップし、最終的にはクラッシュするほどひどいものでした。

これを単なるコメントにしたかったのですが、十分な担当者がいません。これは、この問題を説明しているインターネット上のほぼ唯一の場所ですが、これがいつか他の誰かに役立つことを願っています!

于 2016-11-06T13:07:23.140 に答える