Главная страница
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.023 c
6-24603
qpwoeiruty
2003-07-02 16:50
2003.09.08
Количество получателей в поле TO:


3-24316
Max Zyuzin
2003-08-14 14:20
2003.09.08
Connection to Oracle


3-24335
DBProger
2003-08-18 13:39
2003.09.08
Блокировка добавления/удаления записей в DBGrid


1-24545
Jineura
2003-08-26 16:44
2003.09.08
tSendMail в Delphi7


6-24574
sasha1
2003-07-03 15:42
2003.09.08
Net