Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория / Теория / ОСиСП ответы на некоторые вопросы.doc
Скачиваний:
81
Добавлен:
11.05.2015
Размер:
1.38 Mб
Скачать

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

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

Сообщение приложению от Windows формируется путем создания записи сообщения (Record Message) в очереди сообщений. При этом сохраняется принцип FIFO.

Некоторые сообщения от Windows посылаются непосредственно в окно приложения и не ставятся в очередь. Это так называемые внеочередные сообщения (UM, Unqueued Messages). Типичное UM - это сообщение, которое касается только окна приложения. Хотя большинство сообщений порождается Windows, приложение также может создавать собственные сообщения, помещать их в свою очередь сообщений и посылать другим приложениям.

Цикл приема и обработки сообщений.

Для обработки сообщений главная программа приложения использует непрерывный цикл, так называемый главный цикл сообщений.

Этот цикл содержит некоторое количество функций, предназначенных для обработки сообщений. Как правило, выход из этого цикла совершается только тогда, когда поступает сообщение, которое должно завершить программу. Главный цикл сообщений начинается с вызова функции, которая просматривает очередь сообщений (GetMessage( )).

Когда пользователь нажимает какую-либо клавишу, необходимо послать еще одно сообщение. Это сообщение содержит виртуальный код клавиши (Virtual Key Code), который, хотя и констатирует нажатие клавиши, но не сообщает непосредственно значение символа клавиши. Потому для определения символа сначала вызывается функция (TranslateMessage( )). Затем вызывается функция, которая классифицирует принятое сообщение (DispatchMessage( )). Каждый объект имеет свою процедуру, в которой определены действия для любого из возможных сообщений. Когда эта процедура выполнена, управление передается в начало цикла. Таким образом, сообщения в этом цикле выбираются и обрабатываются последовательно.

Если очередь пуста, ожидается новое сообщение. В этом случае говорят, что приложение находится в режиме ожидания. По-английски это состояние называется Idle. Во время ожидания контроль над системой передается в Windows, благодаря чему другие приложения получают возможность обрабатывать сообщения.

Организация цикла обработки сообщений включает: прием сообщений, трансляцию сообщений, диспетчеризацию сообщений.

Исключение сообщений из очереди сообщений делает одна из функций:

если сообщение WM_QUIT, то функция

BOOL GetMessage(MSG *msg, HWND hWnd, WORD msgFilterMin, DWORD msgFilterMax)

вернет FALSE, иначе TRUE.

BOOL PeekMessage(MSG *msg, HWND hWnd, WORD msgFilterMin, DWORD msgFilterMax, WORD RemoveMsg)

msg – возвращаемое сообщение, если hWnd = 0, то извлекаем сообщения для всех окон. Следующие два параметра (msgFilterMin и msgFilterMax) указывают диапазон сообщений для приема, если оба параметра равны 0 – то принимаем все сообщения.

Параметр RemoveMsg это – одна из 3х констант:

PM_NOREMOVE – Сообщения не удаляются из очереди после запуска PeekMessage

PM_REMOVE – все сообщения, кроме WM_PAINT удаляются из очереди после запуска PeekMessage

PM_NOYIELD – This flag prevents the system from releasing any thread that is waiting for the caller to go idle