Windows зависает в WM_WINDOWPOSCHANGED

У меня есть приложение DirectX9, которое время от времени зависает в WM_WINDOWPOSCHANGED. Зависание происходит только в редких случаях, когда alt + вкладка и выход из полноэкранного эксклюзивного режима.

Приложение зависло, потому что поток обработки сообщений в главном окне застрял в WaitForSingleObject () в обработчике DefWindowProc. Другие темы, которые мы создали, работают нормально.

Вызов стека на главной теме:

 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 ()).

Если у кого-то есть идеи о том, почему окна висят здесь, я был бы признателен.

2

Решение

Обычно, когда я вижу эту проблему, это происходит потому, что SetWindowPos () необходимо вызывать после установки стиля окна с помощью функции SetWindowLong (). Изменения не будут обновляться до тех пор, пока не будет вызван SetWindowPos (), как подробно описано здесь:

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

Кажется, что не всегда происходит сбой без вызова SetWindowPos (), но иногда это происходит. Я не уверен, почему результат обычно так спорадичен. В любом случае результаты не будут обновляться без этого вызова.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector