Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_5 DELPHI_СПО.doc
Скачиваний:
1
Добавлен:
22.11.2018
Размер:
120.32 Кб
Скачать

Сообщения, определяемые пользователем

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.

Алгоритм работы программы

  1. Создается окно.

  2. Окно посылает сообщение самому себе.

  3. Запускается программа Ganesha в отдельном потоке команд.

  4. Ganesha запускает до 15 процессов с различными приоритетами.

  5. Порождаемый процесс создает окно, но не показывает его.

  6. Процессы функционируют аналогично процессам в лабораторной работе №1.

  7. По окончании определенного времени Ganesha посылает всем процессам сообщения.

  8. Процесс, получив сообщение, определяет время, оставшееся до завершения и посылает Ganesha сообщение.

  9. Если время больше одной секунды, то процесс завершается принудительно, если меньше – процесс завершается сам.

Постановка задачи

  1. Исследовать механизм сообщений и консольных программ в ОС Windows на основе разработанной программы.

  2. Изучить функции, реализующие механизмы синхронизации.

  3. Исследовать поведение процессов в ОС Windows путем изменения атрибутов сообщений посылаемых управляющей программой заданным процессами.

  4. Исследовать реакцию системы на изменение времени, отводимого потоку до завершения.

  5. Произвести поиск условий функционирования модели, при которых задача будет решаться не корректно.

  6. Модернизировать представленную программу.