Динамическое событие

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

Сравнение событий и динамических событий

Есть два типа событий: событие и динамическое событие. Оба они используются для планирования в будущем некоторых задаваемых пользователем действий. Разница между ними заключается в том, что динамическое событие удаляется после того, как его действие будет выполнено, в то время, как работающее в "ручном" режиме событие может быть перезапущено и запланировано вновь на другое время.

Существенным преимуществом динамического события является возможность планирования нескольких параллельно работающих экземпляров одного и того же класса динамического события: 


События и динамические события

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

Однако, стоит отметить, что динамические события не столь просты в обращении, как события, поэтому мы рекомендуем использовать их только в следующих случаях:

Простая демо модель: Dynamic Event Models Product Delivery

 Чтобы задать динамическое событие

  1. Перетащите элемент Динамическое событие  из палитры Основная на диаграмму класса активного объекта.
  2. Как только Вы создадите событие, Вы можете изменить его имя в небольшом текстовом редакторе, который появится справа от элемента в графическом редакторе. Закончив ввод нового имени, нажмите Enter.
     Поскольку AnyLogic генерирует Java класс для каждого динамического события, которое Вы добавляете на диаграмму класса активного объекта, Вы должны следовать правилам именования Java. Имя динамического события должно начинаться с заглавной буквы. 
  3. Перейдите на панель Свойства, чтобы задать свойства созданного события. 
  4. Если действие события зависит от какой-то специфической информации, то Вы можете передать эту информацию событию с помощью параметров события. Параметры задаются в таблице Параметры. Каждый параметр задается в отдельной строке таблицы: Вы задаете Имя параметра, его Тип и при необходимости - Значение по умолчанию. При планировании нового динамического события, Вы сможете передать событию какие-то другие значения его параметров, либо оставить значения, заданные по умолчанию.
  5. Задайте действие события в поле Действие. Здесь Вы можете написать Java код, который будет выполняться при происхождении этого события. Все параметры динамического события будут доступны в этом коде. Возможно, более удобно будет задать это действие с помощью функции или диаграммы действий и поместить сюда вызов этой функции.
Основные свойства

Имя – Имя динамического события. Имя используется для идентификации события и доступа к нему из кода.
 Поскольку AnyLogic генерирует Java класс для каждого динамического события, которое Вы добавляете на диаграмму класса активного объекта, Вы должны следовать правилам именования Java. Имя динамического события должно начинаться с заглавной буквы. 

Отображать имя – Если опция выбрана, то имя динамического события будет отображаться в графическом редакторе.

Исключить – Если опция выбрана, то динамическое событие будет исключено из модели.

На презентации – Если опция выбрана, то динамическое событие будет отображаться на презентации во время выполнения модели.

Параметры – Здесь Вы можете задать параметры динамического события, с помощью которых можно передать событию информацию, которую нужно учесть при выполнении его действия. Каждый параметр задается в отдельной строке таблицы: Вы задаете Имя параметра, его Тип и при необходимости - Значение по умолчанию. При планировании нового динамического события, Вы сможете передать событию какие-то другие значения его параметров, либо оставить значения, заданные по умолчанию. Поскольку порядок следования параметров в таблице имеет принципиальное значение (при планировании нового динамического события, Вы должны будете передать значения этих параметров в том же самом порядке, в котором они следуют в этой таблице), AnyLogic позволяет менять порядок их следования в таблице с помощью кнопок и . Чтобы удалить параметр, выделите соответствующую строку таблицы и щелкните по кнопке 

Действие – Java код, выполняемый при происхождении данного события. В коде действия доступны все параметры динамического события (если таковые имеются). 

Планирование динамических событий

Планирование динамических событий отличается от планирования событий. Чтобы запланировать еще один экземпляр класса динамического события, используйте автоматически генерируемый AnyLogic метод:

void create_<имя динамического события>( double timeout, <тип первого параметра> parameter1, <тип второго параметра> parameter2, …)

Таймаут события (время, через которое оно сработает) передается в качестве первого параметра, далее Вы должны передать значения параметров этого события в том порядке, в котором они заданы в таблице Параметры (если они есть). 

Отсчет времени начинается в момент планирования динамического события. Когда истекает время таймаута события, AnyLogic выполняет действие этого события и затем удаляет это динамическое событие (то есть, этот экземпляр класса динамического события). Если перед происхождением события вызывается его метод  reset(), то это динамическое событие удаляется и его действие произведено не будет.

 Обратите внимание, что метод create_...() является единственным разрешенным способом планирования динамических событий. Использование Java конструкторов наподобие new MyDynamicEvent() запрещено.

Программное управление событиями

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

void reset() - Отменяет запланированное событие и удаляет его из активного объекта.

double getRest() - Возвращает время, остающееся до запланированного происхождения данного события.

Но в отличие от события, которое доступно просто по своему имени, обратиться к динамическому событию представляется куда более сложной задачей. 

Вы можете использовать метод getDynamicEvents()класса активного объекта, который возвращает все активные в текущий момент времени динамические события данного активного объекта. Этот метод может быть полезен, например, в том случае, если Вы хотите отменить все динамические события этого объекта. 

Однако отличить одно динамическое событие от другого будет достаточно трудно. Поэтому Вам нужно будет самостоятельно хранить где-то ссылки на активные динамические события. Вы можете создать коллекцию dynamicEvents и добавлять в эту коллекцию все создаваемые динамические события:

MyDynamicEvent de = create_MyDynamicEvent(7.5);
dynamicEvents.add(de);

См. также

 Событие

 Справочник классов: Класс DynamicEvent