Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
1-24406
Хишник
2003-08-28 11:14
2003.09.08
Breakpoint не работает? (CBuilder)


3-24331
Onward
2003-08-19 01:43
2003.09.08
Базы данных...


9-24294
BANick
2003-03-04 17:45
2003.09.08
Люди помогите с Опенгл плиииз


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


14-24668
Aga
2003-08-22 08:20
2003.09.08
setup...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский