Поставленные в очередь (синхронные) сообщения


Система может отображать любое число окон одновременно. Чтобы направить по маршруту ввод данных от мыши и клавиатуры в соответствующее окно, система использует очереди сообщений.

Система поддерживает единственную системную очередь сообщений и одну очередь сообщений определяемых потоком для каждого потока графического интерфейса пользователя (GDI). Чтобы избежать непроизводительного расхода ресурса при создании очереди сообщений для потоков неграфического интерфейса пользователя, все потоки, первоначально, создаются без очереди сообщений. Система создает очередь сообщений определяемых  потоком, только тогда, когда поток делает свой первый вызов одной из функций  User Windows или GDI Windows.

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

За исключением сообщения WM_PAINT, система всегда помещает сообщения в конец очереди сообщений. Это гарантирует то, что окно принимает свои входящие сообщения в полном соответствии с принципом "первым пришел", "первым вышел" (FIFO). Однако сообщение WM_PAINT, сохраняется в очереди и пересылается оконной процедуре только тогда, когда очередь не содержит никаких других сообщений. Несколько сообщений WM_PAINT для того же самого окна объединяются в одно единственное сообщение WM_PAINT, объединяющее все неисправные части рабочей области экрана в единственную область. Объединение сообщений WM_PAINT сокращает число раз, когда окно должно перерисовать содержимое своей рабочей области.

Система помещает сообщение в очередь сообщений потока, при помощи заполнения структуры MSG, а затем копирует ее в очереди сообщений. Информация в MSG включает в себя: дескриптор окна, для которого предназначено сообщение, код сообщения, два параметра сообщения, время, когда сообщение было поставлено в очередь и позицию курсора мыши. Поток может поместить сообщение в своей собственной очереди сообщений или в очередь другого потока, используя функцию PostMessage или PostThreadMessage.

Прикладная программа может удалять сообщение из своей очереди, используя функцию GetMessage. Чтобы проверить сообщение без удаления его из очереди, приложение может использовать функцию PeekMessage. Эта функция заполняет структуру  MSG информацией о сообщении.

После удаления сообщения из его очереди, прикладная программа может использовать функцию DispatchMessage , чтобы предписать системе отправить сообщение оконной процедуре для обработки. DispatchMessage берет указатель на структуру  MSG , которая была заполнена предыдущим вызовом функции GetMessage или PeekMessage. DispatchMessage передает дескриптор окна, код сообщения и два параметра сообщения  оконной процедуре, но функция не передает время, когда сообщение было помещено в очередь или позицию курсора мыши. Приложение может извлечь эту информацию путем вызова функции GetMessageTime и GetMessagePos в ходе обработки сообщения.

Поток может использовать функцию WaitMessage, чтобы уступить управление другим потокам, когда в его очереди нет никаких сообщений. Функция приостанавливает работу потока и не возвращает управление до тех пор, пока новое сообщение не будет помещено в очередь сообщений потока.

Вы можете вызвать функцию SetMessageExtraInfo , чтобы связать значение с очередью сообщений текущего потока. Затем вызвать функцию GetMessageExtraInfo , чтобы получить значение связанное с последним сообщением, извлеченным функцией GetMessage или PeekMessage.

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz