2013-06-13 4 views
0

У меня есть поток, который вызывает ::PostMessage(hWnd, [...]);, чтобы отправить сообщение в основной поток, предупреждая его о результатах операции async.:: PostMessage to invalid hWnd

Тем не менее, я обеспокоен тем, что если нить занимает особенно много времени, чтобы завершить свою работу, hWnd может не существовать при вызове PostMessage (пользователь может закрыть окно).

MSDN Documentation ничего не сообщил о результатах, если hWnd недействителен.

Знаете ли вы, на основе опыта или другой документации, что я могу ожидать, если hWnd недействителен?

+1

Возможно, вам нужно скрыть окно, а не уничтожить его, пока поток не будет выполнен с его помощью. –

+0

@Ben Voigt: Я согласен, но я работаю в большом корпусе и не контролирую этот выбор архитектуры. – abelenky

+0

В настройке с большим корпусом вы можете указать ошибку. См. Мой ответ ... Знаменитый Раймонд Чен сказал, что это ошибка. Другой альтернативой является использование 'weak_ptr' и аннулирование его, когда окно будет уничтожено ... хотя это оставляет вас с условием гонки, интервал между извлечением HWND из слабого указателя и фактическим вызовом' PostMessage'. Так что, действительно, вам нужно сохранить окно живым. –

ответ

3

Raymond Chen писал об этом:

Некоторые выбор выдержки:

Так получилось, что Полные лодки программ (и "Полные лодки" является техническим термином) содержат ошибки, в которых они используют оконные ручки после того, как окно было уничтожено. Когда дескриптор окна повторно используется, эта программа отправляет сообщение в окно, которое, по его мнению, все еще существует, но вместо этого отправляет сообщение в совершенно несвязанное окно. Это не служит хорошим предзнаменованием для программы, и, как правило, это не служит хорошим предзнаменованием для нового окна, которое также получило сообщение по ошибке.


Мы кончили нашу историю в прошлый раз, поднимая проблемы программ, которые посылают сообщения в окнах, которые уже были уничтожены, как оконная ручка повторное использование усугубляет проблему. Хотя это явно ошибка в программах, которые используют оконные дескрипторы после уничтожения окна, проблема настолько распространена, что люди из оконных менеджеров в Windows NT решили принять более активный подход.

0

Как указывали другие, Рамонд Чен объяснил, что произойдет, если HWND будет повторно использоваться в новом окне. PostMessage() преуспеет, он просто перейдет в неправильное окно. Однако в случаях, когда HWND не используется повторно, PostMessage() с ошибкой ERROR_INVALID_WINDOW_HANDLE (1400).

Смежные вопросы