WM_WINDOWPOSCHANGED で散発的にハングアップする DirectX9 アプリケーションがあります。ハングは、Alt+Tab キーを押して全画面排他モードに出入りするときに、まれにしか発生しません。
メイン ウィンドウ メッセージ処理スレッドが DefWindowProc ハンドラーの WaitForSingleObject() でスタックしているため、アプリケーションがハングします。私たちが作成した他のスレッドは正常に動作しています。
スタックしたメイン スレッドのコール スタック:
ntdll.dll!_NtWaitForSingleObject@12() + 0x15 bytes
ntdll.dll!_NtWaitForSingleObject@12() + 0x15 bytes
kernel32.dll!_WaitForSingleObjectExImplementation@12() + 0x43 bytes
kernel32.dll!_WaitForSingleObject@8() + 0x12 bytes
d3d9.dll!WindowProc() + 0x27e95 bytes
user32.dll!_InternalCallWinProc@20() + 0x23 bytes
user32.dll!_UserCallWinProcCheckWow@32() + 0xb7 bytes
user32.dll!_DispatchClientMessage@24() + 0x51 bytes
user32.dll!___fnDWORD@4() + 0x2b bytes
ntdll.dll!_KiUserCallbackDispatcher@12() + 0x2e bytes
user32.dll!_NtUserMessageCall@28() + 0x15 bytes
user32.dll!_RealDefWindowProcWorker@24() + 0x26afe bytes
user32.dll!_RealDefWindowProcW@16() + 0x2a bytes
uxtheme.dll!_ThemeDefWindowProc() + 0x152 bytes
uxtheme.dll!_ThemeDefWindowProcW@16() + 0x18 bytes
user32.dll!_DefWindowProcW@16() + 0x805 bytes
> Player.exe!cnWindowProc(HWND__ * hWnd=0x006507f4, unsigned int message=0x00000047, unsigned int wParam=0x00000000, long lParam=0x0034eea8) Line 502 + 0x18 bytes C++
ここで Windows が何を待っているのか気になります。DirectX は別のスレッドによって作成および所有されていますが、そのスレッドは停止していません。失われたデバイスに対して適切に処理しているようです (ビデオ メモリ リソースを解放し、Reset() を呼び出します)。
窓がここにぶら下がっている理由について誰かがアイデアを持っているなら、私はそれを感謝します.