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

14

СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

Лабораторная работа №5

Тема: «Синхронизация процессов в ОС Windows на основе консольных приложений»

Цель работы: Получение навыков использования механизма консольных приложений для синхронизации работы процессов (посредствам отправки сообщений) в операционной системе Windows.

Теоретические сведения

Сообщения

Приложения Windows управляются событиями. Операционная система передает процессам информацию о событиях в форме сообщений (messages). Сообщения могут посылаться и другими приложениями друг другу.

Сообщение - это особая структура данных, включающая идентификатор и два параметра. Идентификатор - число, обозначающее тип сообщения; он определяет, как его следует обрабатывать. Типам сообщений присвоены символьные идентификаторы; например, WM_KEYDOWN - это нажатие клавиши.

Механизм сообщений в ОС Windows

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

Состав пакета:

  1. дескриптор оконной функции для интерфейса передачи сообщения;

  2. передаваемое сообщение;

  3. два поля типа DWord, предназначенное для передачи данных.

Для каждого окна в Windows создается очередь сообщений. При регистрации класса окна указывается функция обработки сообщений.

Параметры задают дополнительные данные, которые должны быть использованы при обработке. Как интерпретировать параметры - зависит от типа сообщения. Некоторые типы сообщений могут и не требовать параметров, тогда последние равны нулю.

В ОС поступают сообщения ввода, формируемые драйверами устройств и адресуемые окнам. Ядро системы выбирает очередное сообщение, определяет, к какому окну оно относится, и посылает его в очередь потока, который создал это окно - это так называемые буферизуемые (queued) сообщения. Например, функция PostMessage отправляет для заданного окна буферизуемое сообщение.

Консольная программа имеет два потока:

первый - невидимый нам цикл обработки сообщений консольного окна,

второй – конструкция begin ... end.

По двум потокам могут отправляться сообщения.

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

  repeat     GetMessage(Msg,0,0,0);     case Msg.message of       ...     end;   until False;

В отсутствии сообщений, функция GetMessage находится в режиме "сна".

Сообщения потокам - это сообщения, которые никогда не проходят через системную очередь и требуется идентификация потока назначения.

Сообщения системы - реализуют идентификацию автоматически, например, если поток вызовом SetTimer образовал таймер, то сообщения WM_TIMER будут приходить именно ему.

При взаимодействии приложений - программа-отправитель должна пользоваться вызовом PostThreadMessage:

PostThreadMessage(ID,Mess,wParam,lParam);

Программа отправитель должна располагать идентификатором ID потока назначения, который получается из любого механизма межпрограммных связей (реестр, вспомогательные файлы, файлы, размещенные в памяти и т.п.).

Идентификатор может быть получен с помощью функции GetCurrentThreadId.

Для многих сообщений в модуле Messages.dcu описаны собственные типы. Их названия образованы от названия соответствующих сообщений. Например, для сообщения WM_Paint описан тип TWMPaint, для WM_GetText - TWMGetText, и так далее. В этих типах все поля имеют тот тип, который наилучшим образом подходит для обработки именно этого сообщения. Кроме того, поля имеют названия, отражающие их назначения, что делает программу более удобной для чтения. Но такие типы описаны не для всех сообщений, поэтому иногда приходится пользоваться универсальным TMessage.