【问题标题】:Windows hang in WM_WINDOWPOSCHANGEDWindows 在 WM_WINDOWPOSCHANGED 中挂起
【发布时间】:2013-01-18 13:31:32
【问题描述】:

我有一个 DirectX9 应用程序偶尔会在 WM_WINDOWPOSCHANGED 中遇到挂起。当 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())。

如果有人知道为什么 windows 挂在这里,我将不胜感激。

【问题讨论】:

  • 您的模式更改(可能是对DXGISwapChain 函数的调用)是否在具有窗口WindowProc 的线程以外的线程上执行?如果是这样,您可以在模式更改时接受这样的数据竞赛。
  • 我没有使用 DXGI,但我通过 ID3DDevice9::Reset() 更改交换链的大小,然后在 SetWindowLongA() 中更改窗口属性。我想在单独的线程中使用 Directx 9 是个问题,但我找不到禁止它的文档。
  • 这里提到了关于线程的模式更改:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 是的,这很有帮助,谢谢。

标签: c++ windows directx-9


【解决方案1】:

通常当我看到这个问题时,是因为在使用 SetWindowLong() 函数设置窗口样式后需要调用 SetWindowPos()。在调用 SetWindowPos() 之前,不会更新更改,详见此处:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx

如果不调用 SetWindowPos(),它似乎并不总是崩溃,但有时会崩溃。我不确定为什么结果通常如此零星。无论哪种方式,如果没有该调用,结果都不会更新。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2012-07-26
    • 2014-02-12
    相关资源
    最近更新 更多