16. Ресурсы в системе OpenSCADA (Res, ResAlloc, AutoHD)
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах <Res> и <ResAlloc>. Объект <Res> предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте <ResAlloc> реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта TCntrNode, который содержит механизм подключения через шаблон AutoHD. Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от TCntrNode шаблон AutoHD поддерживает приведение типов, основанное на динамическом приведении.
16.1. Объект ресурса (Res)
Публичные методы:
- Res( ); - Инициализация ресурса.
- static void resRequestW( long tm = 0 ); - Запрос ресурса на запись/модификацию с таймаутом ожидания <tm> (в миллисекундах).
- bool resTryW( ); - Попытка захвата ресурса на запись/модификацию. При успешном захвате возвращает "true" иначе "false".
- static void resRequestR( long tm = 0 ); - Запрос ресурса на чтение с таймаутом ожидания <tm> (в миллисекундах).
- bool resTryR( ); - Попытка захвата ресурса на чтение. При успешном захвате возвращает "true" иначе "false".
- static void resRelease( ); - Освобождение ресурса.
16.2. Объект ресурса (ResAlloc)
Публичные методы:
- ResAlloc( Res &rid ); - Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>.
- ResAlloc( Res &rid, bool write, long tm = 0 ); - Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>. С указанием типа ресурса <write> (чтение/запись).
- void request( bool write = false, long tm = 0 ); - Запрос ресурса в указанном режиме <write> (чтение/запись).
- void release( ); - Освобождение ресурса.
16.3. Шаблон (AutoHD)
Публичные методы:
- AutoHD( ); - Инициализация без привязки к объекту.
- AutoHD( ORes *node, const string &who = "" ); - Инициализация с привязкой к объекту <node>. Объект должен содержать функцию AHDConnect() и AHDDisConnect().
- AutoHD( const AutoHD &hd ); - Копирующий конструктор.
- template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s, bool nosafe = false ); - Конструктор приведения типов в безопасном или прямом режиме приведения <nosafe>.
- ORes &at( ) const; - Получение объекта за ресурсом.
- void operator=( const AutoHD &hd ); - Копирование ресурсов.
- void free( ); - Освобождение ресурса.
- bool freeStat( ) const; - Признак «Ресурс свободен».
16.4. Объект строки с доступом, разделённым ресурсом (ResString)
Публичные методы:
- ResString( const string &vl = "" ); - Инициализация строки с указанным значением <vl>.
- void setVal( const string &vl ); - Установка значения строки в <vl>.
- const string &getVal( ); - Получение значения строки.
Публичные атрибуты:
- res - Ресурс строки.
- str - Строка.