Форум: "WinAPI";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
ВнизКто ловит 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c