Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.08;
Скачать: CL | DM;

Вниз

Кто ловит WM_QUIT?   Найти похожие ветки 

 
VD601   (2003-07-07 16:34) [0]

В проекте регистрирую класс окна, создаю его, зацикливаю его

while GetMessage(Msg, WinHandle, 0, 0) do //WinHandle - дескриптор окна.

По приходу WM_QUIT, цикл должен завершаться, а WM_QUIT не приходит (например, при закрытии окна).

в WinProc на WM_DESTROY: PostQuitMessage(0);

Естественно, если поставить GetMessage(Msg, 0, 0, 0), то все работает. Но тогда кто еще в моем потоке ловит WM_QUIT?


 
Игорь Шевченко ©   (2003-07-07 17:08) [1]

WM_QUIT ловит поток. Посло того, как обработано сообщение WM_DESTROY, WinHandle уже не является действительным хендлом окна, и сообщений с ним потоку не приходит.


 
Юрий Зотов ©   (2003-07-07 17:13) [2]

Не все сообщения адресованы именно окнам. Некоторые адресуются самому потоку и у них Msg.HWND = 0. К ним, в частности, относится и сообщение WM_QUIT, если оно было послано функцией PostQuitMessage (а также все сообщения, посылаемые с помощью PostThreadMessage).

Указывая GetMessage(Msg, WinHandle,...), Вы выбираете из очереди только сообщения, адресованные данному окну, поэтому "общепоточное" WM_QUIT не выбирается (оно приходит, но остается в очереди и в итоге цикл не завершается). Соответственно, GetMessage(Msg, 0,...) выбирает все сообщения и все работает нормально.


 
VD601   (2003-07-07 22:07) [3]

2 Юрий Зотов
> Некоторые адресуются самому потоку

А разве поток является "окном" (в терминологии Windows, а не Delphi).
И тогда как различаются потоки, если у них у всех дескрипторы одинаковые, равные нулю?

Извините, что отнимаю ваше время


 
Suntechnic ©   (2003-07-07 22:24) [4]

>VD601
В любом Win приложении всё начинается с потока (или с нити (англ. thread), для тех кто путается в определении понятия потока как последовательности байт). Не с окна, а именно с потока. Первое, что создаёт твоя программа это поток (он называется основным), а вот создавать или не создавать окошко, это уже дело десятое, и в принципе не обязательное.

Так вот, все твои последующие действия (создание окна, вызов ф-ций, запуск цикла выборки сообщений и т.д.) происходят в контексте потока (если не создавались доп. потоки, тогда в контексте основного потока). Обрати внимание, что цикл обработки сообщений создаётся именно для потока, а не для окна. Конечно же, задавая второй параметр ф-ции GetMessage, можно "сказать" циклу выбирать сообщения только заданного окна, но суть вещей от этого не меняется: GetMessage будет выбирать сообщения из очереди сообщений того потока, в котором она вызывается, так что необходимости в дескрипторах потока здесь нет никакой.



Страницы: 1 вся ветка

Текущий архив: 2003.09.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
3-24384
Lexa_m
2003-08-14 23:34
2003.09.08
Проверка вводимого значения на совпадение


3-24336
denick
2003-08-18 13:10
2003.09.08
Помогите пожалуйста с отчетом.


14-24612
Rouse_
2003-08-22 05:58
2003.09.08
Отряд не заметил потери бойца :(


14-24700
kull
2003-08-14 12:08
2003.09.08
Софт для перевода русского в латиницу


4-24746
MishaS
2003-07-07 17:15
2003.09.08
Как определить высоту заголовка формы