Разработка процедур распределения потоков данных и сбора результатов
Распределяем количество каналов в каждом исполнительном модуле таким образом, чтобы заданное число модулей обеспечивало обработку всех возможных каналов ввода. В основном модуле предусмотрен механизм изменения количества модулей в зависимости от сложности реализации конечной системы. Это позволяет сбалансировать показатели производительности и количества занимаемых ресурсов компьютера… Читать ещё >
Разработка процедур распределения потоков данных и сбора результатов (реферат, курсовая, диплом, контрольная)
Рассмотрим написание процедур запуска исполнительных модулей, распределения потоков в основном модуле и сбор конечных результатов. Для этого в сервер Ядра системы MegaSenseV7 внесем изменения, связанные с переходом от последовательной обработки каналов на единой копии библиотеки Megalib к параллельной обработке данных с использование исполнительных модулей и класса взаимодействия. Как было описано ранее, основной процесс берет на себя функции ввода изображений по всем каналам. В зависимости от устройства ввода (или нескольких разнородных устройств) определяется максимальное количество разрешенных каналов ввода и основной модуль инициализирует свою собственную библиотеку, но без каналов обработки. Загружает устройство ввода и определяет максимальное число рабочих каналов.
UINT MaxSecChannels = MPResource (NULL);
UINT MaxUsesCarChannels = MPResource (CFENABLED);
MPCreateEx (MaxSecChannels, 0,0,0);
HDEVICE md = IDAdd (DeviceName, 0);
UINT MaxUsesChannels = IDGetMaxChannels ();
Устанавливаем разрешенное количество исполнительных модулей равное числу максимально возможного количества каналов ввода.
#define MAX_ENABLED_CLASSES 32.
TCWClass *WChannel[MAX_ENABLED_CLASSES];
UINT CW_Number;
memset (WChannel, 0, sizeof (TCWClass *)* MAX_ENABLED_CLASSES);
CW_Number = MAX_ENABLED_CLASSES;
if (MaxUsesChannels.
Распределяем количество каналов в каждом исполнительном модуле таким образом, чтобы заданное число модулей обеспечивало обработку всех возможных каналов ввода. В основном модуле предусмотрен механизм изменения количества модулей в зависимости от сложности реализации конечной системы. Это позволяет сбалансировать показатели производительности и количества занимаемых ресурсов компьютера.
UINT *CW_Num = new UINT [CW_Number];
memset (CW_Num, 0, sizeof (UINT)*CW_Number);
UINT CW_Count=0;
for (int i=0;i.
CW_Num[CW_Count]++;
CW_Count++;
if (CW_Count>=CW_Number) CW_Count=0;
Создаем классы и инициализируем библиотеки, которые в них используются.
for (int i=0;i.
WChannel[i] = new TCWClass (this);
strcpy (WChannel[i]->CW_AlgPath, AlgPath);
WChannel[i]->CW_MPCreateEx (0,CW_Num[i], 0,0);
delete CW_Num;
Далее обращение к функциям модулей производится как к обычным локальным функциям, но через класс WChannel. Например:
WChannel[channel-channel/CW_Number*CW_Number]->CW_СFCHRestart (channel/CW_Number,&InitParam);
Для установки параметров кадра и передачи изображений введены дополнительные функции, которых нет в стандартных функциях библиотеки:
VOID TCWClass: CW_CFCHSetFrameParam (UINT Channel, TCHANNELPROPERTY *prop);
UINT TCWClass: CW_CFCHPutData (UINT Channel, void *imgbuf);
UINT TCWClass: CW_CFCHGetData (UINT Channel, MOTIONRESULT *MotResult, char *maskl);
Функция CW_CFCHSetFrameParam осуществляет установку параметров кадра для осуществления обмена меду классом и исполнительным модулем, функция CW_CFCHPutData осуществляется запуск исполнительного модуля на обработку, а функция CW_CFCHGetData обеспечивает чтение результатов обработки.
После запуска сервера оценивается наличие готового изображения для каждого отдельного канала и производится вызов функции обмена данными с исполнительным модулем. В основном потоке программы производится проверка на флаг FLAG_TMPTY и в случае готовности модуля осуществляется запись входного изображения.
if (WChannel[ch-ch/CW_Number*CW_Number]->MFlag[ch/CW_Number]==FLAG_EMPTY).
WChannel[ch-ch/CW_Number*CW_Number]->CW_MDCHPutData (ch/CW_Number, Image);
Одновременно с этим в том же самом цикле осуществляем проверку окончания обработки ранее загруженного изображения и в случае наличия флага FLAG_READY осуществляем чтение результата. После завершения процедуры обмена флаг готовности исполнительного модуля устанавливается в состояние FLAG_EMPTY, что означает его готовность к приему очередных данных.
if (WChannel[ch-ch/CW_Number*CW_Number]->MFlag[ch/CW_Number]==FLAG_READY){.
WChannel[ch-ch/CW_Number*CW_Number]->CW_MDCHGetData (ch/CW_Number);
WChannel[ch-ch/CW_Number*CW_Number]->MFlag[ch/CW_Number] = FLAG_EMPTY;
Таким образом, осуществляется асинхронное получение изображений, организация их в очередь на обработку и получение результатов для принятия решения в зависимости от алгоритма охраны.
По окончанию работы программы осуществляется освобождение ранее распределенных ресурсов, выгрузка исполнительных модулей и уничтожение объектов класса обмена.
for (int i=0;i.
if (WChannel[i]) {.
WChannel[i]->CW_MPRelease ();
delete WChannel[i];
}.
WChannel[i]=NULL;
MPRelease ();.
При определении количества исполнительных модулей следует учитывать тот факт, что при значительной разгрузке основного процесса и увеличения его производительности появляется возможность использовать дополнительные функции для расширения возможностей конечной системы.
Оформление разработанных модулей в конечный продукт
После компиляции всех модулей и отладки программного обеспечения, разработанные модули можно включить в состав библиотеки разработчика MegaLib V1.2 в качестве дополнительной возможности при проектировании разнообразных многоканальных систем безопасности.
Разработанный и скомпилированный исполнительный модуль mpchannelmng. exe размещается в каталог библиотеки с соответствующим отражением в руководстве пользователя. В каталог документации размещается исходный код управляющего класса с подробным описанием всех методов и переменных, которые использует данный объект. К данным файлам относятся CWManager. cpp — исходный код на языке программирования C++ и CWManager. h — файл описания класса.
Данные модули позволят программистам, которые решили использовать подобный инструмент для разработки собственного программного обеспечения, более полно оценить возможности библиотеки разработчика с точки зрения многозадачного подхода к проектированию высокопроизводительных многоканальных систем, работающих в реальном масштабе времени.