- •Сообщения
- •Сообщения, определяемые пользователем
- •Реализация модели на основе функций api Windows
- •Отчет по лабораторной работе
- •Пример выполнения лабораторной работы №3 Функции Win 32ip, реализуемые в программе
- •Организация синхронизации действий процессов
- •Модуль process_unit.Pas:
- •Модуль curtime_unit.Pas:
- •Модуль a0wait_unit.Pas:
- •Модуль a1wait_unit.Pas:
- •Модуль herd_unit.Pas:
- •Модуль myProcedure_unit.Pas:
- •Листинг выполнения модели
Сообщения, определяемые пользователем
Windows предоставляет возможность программисту создавать свои сообщения, которые могут быть локальными или глобальными. Использование локальных сообщений связано с некоторым риском. Дело в том, что эти сообщения должны посылаться только «своим» окнам, то есть тем, оконные процедуры которых написаны так, чтобы правильно интерпретировать это сообщение. Если послать такое сообщение «чужому» окну, его реакция может быть непредсказуемой, потому что человек, писавший его оконную процедуру, мог использовать сообщение с этим же номером для своих целей.
Реализация модели на основе функций api Windows
В Windows (и, соответственно, в модуле Messages.dcu) определена специальная константа WM_User, равная $400 (1024). Номера стандартных сообщений лежат в диапазоне от 0 до WM_User-1. Для локальных пользовательских сообщений оставлен диапазон от WM_User до $7FFF (32767).
Для глобальных пользовательских сообщений оставлен диапазон от $C000 до $FFFF (от 49152 до 65535).
Глобальные пользовательские сообщения, называемые также строковыми, предназначены специально для тех случаев, когда локальные сообщения оказываются слишком ненадёжными. Например, может потребоваться написать несколько программ, которые взаимодействуют между собой.
Как для посылки так и для получения и обработки пользовательских сообщений необходимо:
1. Зарегистрировать сообщение в ОС, для этого необходимо сообщению присвоить имя (поэтому они называются строковыми). Сообщение регистрируется функцией RegisterWindowMessage, которая возвращает уникальный номер этого сообщения. Если сообщение с таким именем регистрируется впервые, номер выбирается из числа ещё не занятых, если сообщение с таким именем уже было зарегистрировано, то возвращается тот же самый номер, который был присвоен ему при первой регистрации.
Например:
Регистрация пользовательского сообщения:
var WM_MyUserDemoMessage: Cardinal;
.....................
begin
WM_MyUserDemoMessage := RegisterWndowMessage('WM_MyUserDemoMessage')
.....................
end;
2. Функция определяет новое окно сообщения с гарантированной уникальностью его в системе, которое может использоваться в функциях SendMessage, PostMessage, PostThreadMessage.
Алгоритм работы программы
-
Создается окно.
-
Окно посылает сообщение самому себе.
-
Запускается программа Ganesha в отдельном потоке команд.
-
Ganesha запускает до 15 процессов с различными приоритетами.
-
Порождаемый процесс создает окно, но не показывает его.
-
Процессы функционируют аналогично процессам в лабораторной работе №1.
-
По окончании определенного времени Ganesha посылает всем процессам сообщения.
-
Процесс, получив сообщение, определяет время, оставшееся до завершения и посылает Ganesha сообщение.
-
Если время больше одной секунды, то процесс завершается принудительно, если меньше – процесс завершается сам.
Постановка задачи
-
Исследовать механизм сообщений и консольных программ в ОС Windows на основе разработанной программы.
-
Изучить функции, реализующие механизмы синхронизации.
-
Исследовать поведение процессов в ОС Windows путем изменения атрибутов сообщений посылаемых управляющей программой заданным процессами.
-
Исследовать реакцию системы на изменение времени, отводимого потоку до завершения.
-
Произвести поиск условий функционирования модели, при которых задача будет решаться не корректно.
-
Модернизировать представленную программу.