Методы Lock и Unlock используются для создания глобальной критической секции при необходимости обеспечения синхронизации скриптов, запускаемых в отдельных потоках. Метод Lock открывает критическую секцию, метод Unlock закрывает.
Необходимо обязательно вызывать метод Unlock, если был вызван метод Lock. В противном случае система может зависнуть. |
Рекомендуется по возможности избегать использования методов Lock и Unlock.
Синтаксис обращения к методам:
function Lock() |
function Unlock() |
Пример. По макрокоманде 1 посчитать общее количество лучей и реле, находящихся в тревоге. Подсчет объектов каждого типа производить одновременно (в отдельном скрипте). Результат записать в глобальную переменную counter.
Скрипт 1:
//Считается количество реле в тревоге var i = Number(0); if (Event.SourceType == "MACRO" && Event.SourceId== "1" && Event.Action == "RUN") { var msg = CreateMsg(); msg.StringToMsg(GetObjectIds("GRELE")); var objCount = msg.GetParam("id.count"); var k; for(k= 0; k < objCount; k++) if(GetObjectState("GRELE", msg.GetParam("id." + k))== "ALARM"){ Lock(); i = Itv_var("counter"); i++; Itv_var("counter")=i; Unlock(); } } |
Скрипт 2:
//Считается количество лучей в тревоге var i = Number(0); if (Event.SourceType == "MACRO" && Event.SourceId== "1" && Event.Action == "RUN") { var msg = CreateMsg(); msg.StringToMsg(GetObjectIds("GRAY")); var objCount = msg.GetParam("id.count"); var k; for(k = 0; k < objCount; k++) if(GetObjectState("GRAY", msg.GetParam("id." + k))== "ALARMED"){ Lock(); i = Itv_var("counter"); i++; Itv_var("counter")=i; Unlock(); } } |
Если в данном примере не использовать методы Lock() и Unlock(), могут возникнуть коллизии и посчитанное значение окажется меньше, чем реальное. |