Hold


Блокирует/снимает блокировку с потока агентов на определенном участке блок-схемы. Объект Hold используется, например, когда объект может принимать агентов, но вы не хотите (временно) продолжать их обработку или когда нужно заблокировать поступление агентов только от какого-то определенного объекта, в то же время принимая агентов, приходящих с выходных портов других объектов.

Состоянием объекта можно управлять программно с помощью метода setBlocked().

В отличие от других объектов библиотеки, Hold не хранит агентов внутри (даже в течение нулевого времени) и может рассматриваться как расширение входного или выходного порта (или портов).

Демо модель: Hold

Параметры

Режим
Здесь вы можете выбрать режим блокировки/разблокировки для объекта Hold. Имеются три режима:
Вручную (использовать функции block(), unblock()) - объект будет заблокирован вызовом метода block() и разблокирован вызовом unblock().
Блокировать после заданного кол-ва агентов - объект будет заблокирован автоматически, как только заданное количество агентов прибудет в его входной порт. Объект будет разблокирован вызовом метода unblock().
Условное (свое условие для каждого агента) - объект будет принимать решение, заблокировать ли вход или нет, в зависимости от того, как вычисляется Условие блокировки для каждого входящего агента.
Имя: mode
Изменить значение: set_mode(новое значение)
Значения: Вручную (использовать функции block(), unblock()) - Hold.MANUAL
Блокировать после заданного кол-ва агентов - Hold.BLOCK_AFTER_N_ENTITIES
Условное (свое условие для каждого агента) - Hold.CONDITIONAL
Кол-во агентов для данного блока
[Параметр виден, если Режим: Блокировать после заданного кол-ва агентов] Количество агентов, которые должны прибыть ко входному порту объекта, чтобы заблокировать Hold.
Синтаксис: int nEntitiesForSelfBlock
Условие блокировки [динамический]
[Параметр виден, если Режим: Условное (свое условие для каждого агента)] Здесь вы можете указать условие, которое будет заново вычисляться для каждого агента. Если условие вычисляется как true, то объект Hold будет заблокирован. Вы можете изменять условие динамически, в этом случае, вам необходимо вызвать функцию объекта recalculateConditions(), которая сообщает блоку Hold пересчитать условия блокировки для всех агентов, которые в данный момент удерживаются этим блоком.
Тип значения: boolean
Локальная переменная: T agent - агент.
Изначально заблокирован
Если опция выбрана (true), то объект изначально находится в заблокированном состоянии.
Синтаксис: boolean initiallyBlocked
Значение по умолчанию: false
Действия
При входе [код]
Код, выполняемый при прохождении агента через объект.
Локальная переменная: T agent - агент.

Функции

void setBlocked(boolean blocked) - Блокирует входной порт, если в качестве значения аргумента передано true, и разблокировывает его в обратном случае.

boolean isBlocked() - Возвращает true, если входной порт заблокирован. Если порт не заблокирован - возвращает false.

void block() - Блокирует входной порт. Не делает ничего, если порт уже заблокирован.

void unblock() - Разблокировка входного порта. Не делает ничего, если порт не заблокирован.

boolean toggleBlock() - Изменяет состояние "заблокирован" и возвращает новое состояние (заблокирован = true).

void recalculateConditions() - Используйте эту функцию, чтобы заставить блок Hold пересчитать условия блокировки для всех агентов, удерживаемых в данный момент в этом блоке.

Порты

in
Входной порт.
out
Выходной порт.