Помощь в написании студенческих работ
Антистрессовый сервис

Разработка программного обеспечения

РефератПомощь в написанииУзнать стоимостьмоей работы

Для организации памяти мы применяем следующие команды Win32 API: OpenFileMapping, MapViewOfFile. Вызывающий процесс после загрузки модуля организует файл, отраженный в памяти под уникальным названием для каждого исполнительного модуля, т. е. организует буфер обмена через оперативную память. Из основного модуля поступают последовательность сообщений для организации процедур подключения к данной… Читать ещё >

Разработка программного обеспечения (реферат, курсовая, диплом, контрольная)

Разработка независимых вычислительных модулей

Независимые вычислительные модули должны представлять собой однотипные исполнительные процедуры, загружаемые из единого файла, каждый из которых осуществляет вызов своей копии динамической библиотеки Megalib1. DLL и обеспечивает обработку группы независимых каналов, количество которых определяется количеством каналов в многоканальной системе и количеством запускаемых модулей. Принятие решения о количестве запускаемых модулей осуществляется основным вызывающим процессом. Обмен данными и результатами между этими процессами должен происходить через единое адресное пространство оперативной памяти, а инициализация обмена будет определена сообщениями, которые направляются от основного процесса исполнительному модулю. Для упрощения взаимодействия основного процесса и вычислительного модуля, а также для использования данного решения третьими лицами без разработки собственного приложения создается отдельный класс, который впоследствии будет оформлен как исходный модуль в составе библиотеки разработчика MegaLib V1.2.

Для обмена данными в модуле предусмотрена система команд, название и назначение которых приведено в таблице:

Таблица 1.

Команда.

Назначение команды.

INIT_MEGALIB_APP.

Передать указатель класса обмена.

CLOSE_MEGALIB_APP.

Отсоединиться от общей памяти и прекратить выполнение приложения.

OPEN_MEGALIB_APP.

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

PARENT_MEGALIB_APP.

Передать указатель окна основного процесса.

HIDE_MEGALIB_APP.

Скрыть окно исполнительного модуля.

EXECUTE_MEGALIB_APP.

Выполнить процедуру библиотеки Megalib.

MAPBUFFER_MEGALIB_APP.

Активизировать буфер обмена.

UNMAPBUFFER_MEGALIB_APP.

Освободить буфер обмена.

SETBUFFERSIZE_MEGALIB_APP.

Установка размера буфера обмена между основным модулем и исполнительным.

Для организации памяти мы применяем следующие команды Win32 API: OpenFileMapping, MapViewOfFile. Вызывающий процесс после загрузки модуля организует файл, отраженный в памяти под уникальным названием для каждого исполнительного модуля, т. е. организует буфер обмена через оперативную память. Из основного модуля поступают последовательность сообщений для организации процедур подключения к данной области памяти:

WParam = SETBUFFERSIZE_MEGALIB_APP, LParam = BufferSize;

WParam = PARENT_MEGALIB_APP, LParam = ParentWin;

WParam = INIT_MEGALIB_APP, LParam = ParentHandle;

WParam = OPEN_MEGALIB_APP, LParam = ProcessId;

Где: BufferSize — размер буфера обмена, ParentWin — указатель вызывающего окна, ParentHandle — указатель вызывающего объекта, ProcessId — идентификатор вызывающего приложения.

При помощи функции OpenFileMapping определяется объект файла, а при помощи функции MapViewOfFile получается указатель на общую область памяти. В названии файла применяются значения указателя вызывающего класса (ParentHandle) и идентификатор вызывающего процесса (ProcessId).

sprintf (chbuffer," MegaPixel Channels Application Maps %08X-%08X" ,(UINT)ParentHandle, ProcessId);

MapHandle = OpenFileMapping (FILE_MAP_READ | FILE_MAP_WRITE, TRUE, chbuffer);

MappedPointer = MapViewOfFile (MapHandle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, BufferSize);

sprintf (chbuffer," MegaPixel Channels Application Flags %08X-%08X" ,(UINT)ParentHandle, ProcessId);

MapHandleF = OpenFileMapping (FILE_MAP_READ | FILE_MAP_WRITE, TRUE, chbuffer);

MappedPointerF = MapViewOfFile (MapHandleF, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, MAX_PROCESS_CHANNEL * 4 * sizeof (UINT));

Таким образом, создается уникальное имя в системе, что предотвращает возникновение неоднозначности в определении области общей памяти.

Для обмена данными и контрольной информацией в модуле используются две таких области памяти: память данных, и память флагов. Через область данных происходит обмен исходными данными и результатами вычислений, а через область флагов оценивается состояние исполнительного модуля. Выделение двух областей памяти связано с тем что, в процессе вычислений возможно одновременное изменение состояния модуля во время передачи данных. Флаги состояния описывают три состояния, в которых может находиться исполнительный модуль:

FLAG_EMPTY — «модуль готов к приему данных».

FLAG_ACTIVE — «модуль обрабатывает полученные данные».

FLAG_READY- «полученные данные готовы для чтения».

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

После определения указателей на общую память модуль может принимать команды на выполнение операций. Для этого в первую ячейку память помещается команда, за которой идут данные, соответствующие данной команде. Информация о готовности данных поступает при помощи сообщения: WParam = EXECUTE_MEGALIB_APP. Исполнительный модуль после поступления данного сообщения, определяет команду в первой ячейке памяти обмена и выполняет ее.

В каждом модуле организуется очередь данных, над которыми следует выполнить процедуры детектирования движения. Если данная очередь пуста, модуль находится в режиме ожидания, не выполняя никаких действий (флаг состояния в положении FLAG_EMPTY). По готовности изображения основной модуль передает в исполнительный модуль параметры кадра и непосредственно последовательность байт самого изображения. Данная информация помещается в очередь обработки. При этом флаг состояния по данному каналу устанавливается в состояние FLAG_ACTIVE. Исполнительный модуль активизирует свой собственный поток обработки, в котором происходит выполнение процедур детектирования движения над данными, находящимися в очереди. После окончания обработки по данному каналу соответствующий флаг переходит из состояния FLAG_ACTIVE в состояние FLAG_READY. Обработка очереди осуществляется до ее обнуления. Очередь может пополняться данными других каналов асинхронно с процессом обработки, но с условием, что для одного канала в очереди может находиться только один блок данных. Это связанно с тем, что необходимо осуществить чтение результатов обработки и осуществить перевод флага из положения FLAG_READY в положение FLAG_EMPTY.

Исполнительный модуль осуществляет еще одну важную функцию, связанную с аварийным окончанием работы. Один раз в 500 миллисекунд модуль проверяет наличие вызывающего процесса по его идентификатору. В случае его отсутствия в системе прекращает свою работу.

Перед окончанием работы по команде CLOSE_MEGALIB_APP модуль освобождает общую память обмена и прекращает свою работу:

UnmapViewOfFile (MappedPointer);

CloseHandle (MapHandle);

MappedPointer=NULL;

MapHandle=NULL;

UnmapViewOfFile (MappedPointerF);

CloseHandle (MapHandleF);

MappedPointerF=NULL;

MapHandleF=NULL;

if (MPCreated) MPRelease ();

Close ();

Показать весь текст
Заполнить форму текущей работой