Событие, происходящее по истечении таймаута

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

Событие, происходящее по истечению таймаута предоставляет дополнительные возможности: вы можете сделать такое событие циклическим, либо же вообще управлять этим событием "вручную". Это позволяет эффективно решать следующие задачи: 


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

Циклическое событие может так же легко оперировать и с календарными датами. В этом случае вам будет нужно задать календарную (модельную!) дату, когда вы хотите, чтобы событие произошло в первый раз, и задать Период срабатывания этого события (здесь вы можете использовать функции времени AnyLogic (second(), minute(), hour(), day(), week()), которые возвращают модельные времена, равные соответствующим единицам времени). Например, чтобы сделать событие еженедельным, введите в качестве значения периода week().

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

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

Свойства

Основные свойства

Имя – Имя события. Имя используется для идентификации события и доступа к нему из кода.

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

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

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

Тип события – Тип события:

По таймауту – Событие происходит по истечению таймаута. Событие будет происходить согласно выбранному Режиму.

С заданной интенсивностью – Событие происходит с заданной интенсивностью (которая задается в поле Интенсивность)

При выполнении условия – Событие происходит при выполнении заданного условия (которое задается в поле Условие).

Режим –  [Свойство отображается, только если Тип события: По таймауту] Выберите здесь режим события, срабатывающего по таймауту:

"Ручной"– вы будете самостоятельно управлять событием, планируя его происхождение на нужные вам моменты времени. Такое событие будет происходить только при вызове пользователем метода restart() этого события, которому в качестве аргумента передано значение времени, которое должно будет пройти от текущего момента времени до его срабатывания, например: myEvent.restart(15).

 Если таймаут будет иметь фиксированное (одно и то же) значение, то можно просто ввести это значение в поле Таймаут и вызывать метод myEvent.restart(), без задания значения таймаута с помощью параметра метода.

Срабатывает один раз – Событие произойдет только один раз, в момент времени, заданный в поле Время срабатывания (абсолютное). Время срабатывания может быть задано как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели. 
 Обратите внимание, что здесь вы задаете абсолютное время, и если это значение будет меньше текущего значения модельного времени, когда вы создадите это событие, то такое событие никогда не произойдет.

Циклический – Событие будет происходить периодически. Вы задаете Время первого срабатывания (абсолютное) и Период. Время первого срабатывания может быть задано как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.  
Обратите внимание, что здесь вы оперируете абсолютным временем. Если вы хотите использовать относительные времена (т.e. отсчитывать время первого срабатывания от момента создания события), то используйте функцию time() в поле Время первого срабатывания (абсолютное). Функция time() возвращает текущее значение модельного времени (в данном контексте она будет возвращать время создания события).

Таймаут – [Свойство отображается, только если Тип события: По таймауту и выбран Режим "Ручной"]Выражение, вычисляющее значение времени, которое должно пройти от момента планирования события пользователем (путем вызова метода restart() этого события) до происхождения этого события.

Время срабатывания (абсолютное) –  [Свойство отображается, только если Тип события - По таймауту и выбран Режим Срабатывает один раз] Абсолютное время срабатывания события, заданное как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.  

Время первого срабатывания (абсолютное) – [Свойство отображается, только если Тип события: По таймауту и выбран Циклический Режим] Абсолютное время первого срабатывания циклического события, заданное как календарная дата (модельного времени!) или как число единиц модельного времени, которое должно пройти от момента запуска модели.  

Период – [Свойство отображается, только если Тип события: По таймауту и выбран Циклический Режим] Период срабатывания циклического события.

Интенсивность – [Свойство отображается, только если Тип события: С заданной интенсивностью] Интенсивность, с которой будет происходить данное событие. С математической точки зрения, событие будет происходить с таймаутом, вычисляемым согласно экспоненциальному закону распределения с параметром, равным заданному в этом поле значению. Т.e., если интенсивность равна 5, то событие будет происходить в среднем 5 раз в единицу модельного времени.

Условие – [Свойство отображается, только если Тип события: При выполнении условия] Условие, при выполнении которого произойдет данное событие.

Действие

Java код, выполняемый при происхождении данного события.

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

 Вы можете программно управлять событием этого типа с помощью соответствующего программного интерфейса

boolean isActive() - Возвращает true, если событие запланировано, или false, если не запланировано. 

void reset() - Отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем). Если событие работает в Циклическом режиме, то цикл не возобновится до тех пор, пока не будет вызван метод restart() или restart(double timeout)

void restart() - Перезапускает событие (отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его на другой момент времени согласно текущему значению Таймаута).

void restart(double timeout) -  Перезапускает событие (отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его через заданный таймаут timeout). Таймаут указывается в единицах модельного времени.
Если событие циклическое, то в дальнейшем оно продолжит планироваться согласно изначально заданному таймауту.
Параметр: timeout - время (от текущего момента), на которое будет запланировано событие.

void restart(double timeout, TimeUnits units) - Перезапускает событие (отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его через заданный таймаут timeout в указанных единицах измерения времени). Если событие циклическое, то в дальнейшем оно продолжит планироваться согласно изначально заданному таймауту.
Параметры: timeout - время (от текущего момента), на которое будет запланировано событие. 
          unitsконстанта единиц измерения времени
Пример: event.restart(10, MINUTE) планирует событие event через 10 минут от текущего момента модельного времени.

void restartTo(double time) - Перезапускает событие (отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его на абсолютное модельное время time. Таймаут указывается в единицах модельного времени. Если событие циклическое, то в дальнейшем оно продолжит планироваться согласно изначально заданному таймауту.
Эта функция может показаться похожей на restart(time - time()), однако она отличается тем, что исключает ошибку численного расчёта, которая может произойти на любом устройстве.
Параметр: time - модельное время (абсолютное), на которое будет запланировано событие.

void restartTo(double time, TimeUnits units) - Перезапускает событие (отменяет запланированное событие, если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его на абсолютное модельное время time. Таймаут указывается в единицах модельного времени. Если событие циклическое, то в дальнейшем оно продолжит планироваться согласно изначально заданному таймауту.
Эта функция может показаться похожей на restart(time - time()), однако она отличается тем, что исключает ошибку численного расчёта, которая может произойти на любом устройстве.
Параметры: time - модельное время (абсолютное), на которое будет запланировано событие.
          unitsконстанта единиц измерения времени

void restartTo(Date date) - Перезапускает событие (отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и планирует его на модельную дату date. Если событие циклическое, то в дальнейшем оно продолжит планироваться согласно изначально заданному таймауту.
Эта функция может показаться похожей на restart(toTimeout(...)) однако она отличается тем, что исключает ошибку численного расчёта, которая может произойти на любом устройстве.
Параметр: date - модельная дата, на которую будет запланировано событие.

void suspend() - Приостанавливает событие (отменяет запланированное событие (если в текущий момент это событие запланировано на какой-то момент в будущем) и запоминает время, оставшееся до его происхождения, для того, чтобы впоследствии вы могли возобновить его выполнение путем вызова метода resume()). Если же на момент вызова метода suspend() это событие не запланировано, то при последующем вызове метода resume() ничего не произойдет. Обратите внимание, что вы не должны вызывать метод suspend() (т.e. не должны пытаться приостановить событие) в коде действия этого события: в этом случае будет происходить то же, что и при вызове метода reset()

void resume()- Возобновляет выполнение ранее приостановленного события (в качестве таймаута такого события будет установлено время, оставшееся до его происхождения на момент приостановки этого события). Не выполняет ничего, если событие не было приостановлено или уже было отменено или запущено после его последней остановки.

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

double getRest(TimeUnits units) - Возвращает время, оставшееся до запланированного происхождения события в заданных единицах времени, или Double.POSITIVE_INFINITY, если событие не запланировано.
Параметр: unitsконстанта единиц измерения времени.
Пример: event.getRest(MINUTE) возвращает оставшееся время в минутах.


См. также

 Событие

 Событие, происходящее с заданной интенсивностью

 Событие, происходящее при выполнении условия

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

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