Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
16
Добавлен:
20.06.2014
Размер:
523.26 Кб
Скачать

Посылка синхронных сообщений

LRESULT SendMessage (HWND hwnd,

UINT uMsg,

WPARAM,

LPARAM);

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

Существует два разных варианта:

  1. Функция SendMesssage посылает сообщение окну, созданному этим же потоком. В этом случае процесс обработки после диспетчеризации вызывается как подпрограмма.

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

Для исключения зависания при обработке сообщений предусмотрена специальная функция с ожиданием тайм – аута обработки.

LRESULT SendMessageTimeout (HWND,

UINT,

WPARAM,

LPARAM,

UINT flags,

UINT timeout,

void *result);

Для данной функции предусмотрены флаги, модифицирующие ее поведение, они передаются в виде аргументов flags и указателей, следует ли возвращение немедленно, если система уже имеет информацию о том, что поток – адресат завис; другой флаг предотвращает обработку вызывающим потоком всех других входящих запросов, пока синхронная посылка не завершится. Если данный флаг не установлен, то в момент ожидания результата вызывающий поток мог бы реагировать на посланные ему синхронные сообщения.

Выборка сообщений

BOOL GetMessage (MSG *msg,

HWND,

unsigned int FilterMin,

unsigned int FilterMax);

Функция осуществляет выборку сообщений из очереди вызывающого потока. Информация об очередном сообщении заносится в специально подготовленную структуру msg, в полях которой сохраняется вся актуальная для данного сообщения информация. Функция может выбирать как сообщение, адресованное любым окном (второй параметр равен NULL), так и конкретным, если указан ненулевой дескриптор. Функция позволяет указать диапазон кодов. Тогда приложение может анализировать очередь в соответствии с какими – нибудь диапазонами.

Функция не возвращает управление до тех пор, пока очередь пуста. При этом поток снимается с исполнения и не расходуется процессами ресурсов. Возвращает значение ноль, если для очереди вызывающего потока установлен признак WM_QUIT (PostQuitMessage).

В случае наличия сообщений в очереди возвращается положительное значение, однако функция может возвращать значение –1 в случае ошибки.

Соседние файлы в предмете Системное программное обеспечение