Главная страница
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-24593
Sim
2003-07-07 20:59
2003.09.08
Простейшее соединение


14-24642
Pindos
2003-08-20 01:52
2003.09.08
Please Help!!! Задача по Hard Drive! тобишь, по жесткому диску!


1-24533
Lina
2003-08-26 14:51
2003.09.08
ListView


1-24469
Karburator
2003-08-27 16:28
2003.09.08
компонент ShellListView


6-24597
RedFox
2003-07-02 12:12
2003.09.08
Поддержка сети в Delphi 7