Windows’95 и Windows NT, Сходства и различия, страница 3

Самой насыщенной группой сообщений является группа сообщений управления окнами. Символьные идентификаторы для этих сообщений начинаются сWM_. Эта группа настолько велика, что уместно еще раз разбить ее на категории. Эти категории включают сообщения DDE (dymanic data exchange), сообщения буфера обмена, мыши, клавиатуры, сообщения не клиентской области (сообщения, связанные с заголовком, границей, областью меню окна, обычно такие сообщения обрабатываются операционной системой, а не приложением), сообщения MDI (multiple-document interface) и многие другие типы. Эти категории несколько неточны, не всегда строго определены; они просто служат для удобства программистов, чтобы можно было представить себе картину большого множества событий управления окнами. Множество сообщенийWM_ также не фиксировано, оно растет по мере добавления новых возможностей операционной системы.

Другие группы сообщений связаны с определенными типами окон. Существуют сообщения, определенные для полей ввода, кнопок, списков, комбинированных списков, полос прокрутки, элементов просмотра списков и деревьев и т.д. Эти сообщения за редким исключением обычно обрабатываются оконной процедурой класса окна элемента управления и редко представляют интерес для программистов приложений.

Приложения также могут определять собственные сообщения. Уникальный идентификатор сообщения можно получить вызовом функцииRegisterWindowMessage. Использование собственных типов сообщений позволяет частям приложения связываться между собой; разные приложения также могут обмениваться информацией таким способом. В 16-разрядной Windows взаимодействующие приложения обычно обменивались данными, пересылая друг другу дескрипторы (handles) глобальных объектов памяти. В Win32 этот механизм не используется, так как приложения больше не делят адресное пространство. Однако для взаимодействия приложений доступны более мощные механизмы (например, отображаемые в памяти файлы).

Очереди сообщений

В 16-разрядной версии Windows операционная система поддерживает единственную очередь сообщений. Сообщения, генерируемые различными событиями операционной системы, такими как прерывания от мыши или клавиатуры, помещаются в очередь сообщений. Когда приложение осуществляет попытки извлечь из очереди следующее сообщение с помощью функцииGetMessage илиPeekMessage, операционная система может выполнить переключение контекста и активизировать другое приложение, которого ожидают сообщения в очереди. После этого сообщение на вершине очереди извлекается и возвращается активному приложению через структуру MSG.

Если приложению не удается вызвать функцииGetMessage, PeekMessage илиYield (которая позволяет приложению освободить управление без проверки очереди сообщений), это "подвешивает" систему. Сообщения начинают накапливаться в очереди сообщений; и так как очередь имеет фиксированный размер, в конце концов она переполняется. Windows отвечает на это звуковым сигналом при поступлении каждого нового сообщения, которое не может быть помещено в очередь; в результате система начинает непрерывно выдавать звуковые сигналы даже при перемещении мыши.

В Win32 (Windows NT и Windows 95) механизм очереди сообщений более совершенен. В этих операционных системах с вытесняющей многозадачностью больше не гарантируется упорядоченное совместное выполнение конкурирующих задач или потоков. Два или более потока вполне могут одновременно попытаться получить доступ к очереди сообщений; кроме того, поскольку переключение задач больше не зависит от следующего доступного сообщения в очереди, нет гарантии, что задача будет получать только сообщения, адресованные ей. Это одна из причин, по которой единственная очередь сообщений в 16-разрядной Windows была разделена на индивидуальные очереди для каждого потока в системе.

Потоки и сообщения

Ранее было указано, что окна принадлежат отдельным потокам. Соответственно, каждый поток имеет свою очередь сообщений, в которую операционная система помещает сообщения, адресованные окнам этого потока. Означает ли это, что поток должен иметь хотя бы одно окно и содержать цикл сообщений?

Рис.  Взаимодействие программных потоков и очередей сообщений