2

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() を呼び出します)。

窓がここにぶら下がっている理由について誰かがアイデアを持っているなら、私はそれを感謝します.

4

1 に答える 1

0

通常、この問題が発生するのは、SetWindowLong() 関数でウィンドウ スタイルを設定した後に SetWindowPos() を呼び出す必要があるためです。ここで詳しく説明されているように、変更は SetWindowPos() が呼び出されるまで更新されません。

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

SetWindowPos() を呼び出さないと常にクラッシュするわけではありませんが、クラッシュすることもあります。結果が通常それほど散発的である理由はわかりません。いずれにせよ、結果はその呼び出しなしでは更新されません。

于 2013-01-17T14:56:33.637 に答える