
- •Сегменты стека
- •Динамическая память (куча)
- •Объектно ориентированный подход к проектированию системных модулей на основе концепций интерфейсов и реализаций.
- •Родовые данные или данные класса, значение которых относится не к экземпляру, а к типу в целом.
- •Активные объекты
- •Активные объекты с множественными рабочими потоками
- •Посылка синхронных сообщений
- •Выборка сообщений
- •Пример полной и упрощенной выборки
- •Сообщения, определяемые приложением
- •Локальная память потока
- •Трансляторы, компиляторы и интерпретаторы.
- •Общая схема работы транслятора
- •Понятие прохода
- •Генерация кода
- •Многоадресный код с явно именуемым результатом
- •Алгоритм вычисления выражений в полной записи
- •Современные системы программирования
Посылка синхронных сообщений
LRESULT SendMessage (HWND hwnd,
UINT uMsg,
WPARAM,
LPARAM);
Функция возвращает управление только тогда, когда сообщение фактически обработано, вообще говоря, она может зависнуть, если поток – адресат не обработает сообщение.
Существует два разных варианта:
-
Функция SendMesssage посылает сообщение окну, созданному этим же потоком. В этом случае процесс обработки после диспетчеризации вызывается как подпрограмма.
-
Другой, более сложный вариант, когда посылается сообщение окну, созданному другим потоком, возможно, в другом процессе. В этом случае система обязана приостановить вызываемый поток, упаковать сообщение и поместить в очередь адресата, дождаться появления от него результатов в специально предусмотренной очереди ответов на синхронные сообщения. Только после этого она может прекратить ожидание и возвратить пакет из очереди результатов, как возвращает сообщение из 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 в случае ошибки.