我有一个DirectX9应用程序偶尔运行到挂起WM_WINDOWPOSCHANGED。 当alt +进入和退出全屏独占模式时,挂起很less出现。
因为主窗口消息处理线程被阻塞在DefWindowProc处理程序的WaitForSingleObject()中,所以应用程序被挂起。 我们创build的其他线程正常运行。
调用堆栈上的主线程:
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是由一个单独的线程创build和拥有的,但该线程没有被卡住。 我们似乎正在处理丢失设备的东西(释放video内存资源并调用Reset())。
如果有人有关于为什么窗户挂在这里的想法,我将不胜感激。
通常当我看到这个问题时,是因为SetWindowPos()需要在用SetWindowLong()函数设置窗口样式之后调用。 在调用SetWindowPos()之前,更改不会更新,如下所述:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx
不调用SetWindowPos()并不总是崩溃,但有时候会崩溃。 我不知道为什么结果通常是零星的。 无论哪种方式,没有这个调用的结果将不会更新。