AnyLogic
Развернуть
Размер шрифта

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

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

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

  • Планирование периодических событий. Циклический режим события позволяет пользователю выполнять некоторые действия с требуемой периодичностью, например, каждое утро или ежеквартально. Используйте циклические события в синхронных моделях.
    На приведенном ниже рисунке показан простейший пример циклического события, выполняющего одно и то же действие по прошествии очередной единицы модельного времени:

    Другой (возможно, более наглядный) пример. Предположим, что в модели производства нужно выполнить какие-то действия в начале новой рабочей смены (в 8 часов утра). Такое поведение может быть легко реализовано с помощью циклического события. В этом случае, если единицами модельного времени в вашей модели являются часы, то вам нужно просто ввести 8 в поле Время первого срабатывания (абсолютное) и 24 в поле Период.
    Циклическое событие может так же легко оперировать и с календарными датами. В этом случае вам будет нужно задать календарную (модельную!) дату, когда вы хотите, чтобы событие произошло в первый раз, и задать Период срабатывания этого события (здесь вы можете использовать функции времени AnyLogic (second(), minute(), hour(), day(), week()), которые возвращают модельные времена, равные соответствующим единицам времени). Например, чтобы сделать событие еженедельным, введите в качестве значения периода week().
  • Планирование действия на самое начало моделирования. Иногда вам может понадобиться выполнить какие-то действия в самом начале моделирования, но уже после того, как будет выполнен код действия При запуске типа агента. Это можно реализовать с помощью события, работающего в режиме Срабатывает один раз, у которого задан Таймаут 0.
  • Планирование действия через заданный момент времени от текущего момента времени. Такое поведение может быть реализовано с помощью события, работающего в режиме "Ручной". Управлять таким событием (планировать его, приостанавливать и т.д.) можно вручную с помощью программного интерфейса соответствующего класса. Чтобы запланировать такое событие, нужно вызвать метод restart() этого события, передав требуемое значение таймаута в качестве аргумента:

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

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

  1. Перетащите элемент Событие  из палитры Агент на диаграмму типа агентов.
  2. Как только вы создадите событие, вы можете изменить его имя в небольшом текстовом редакторе, который появится справа от элемента в графическом редакторе. Закончив ввод нового имени, нажмите Enter.
  3. Перейдите в панель Свойства и выберите По таймауту из выпадающего списка Тип события.
  4. Задайте действие события в секции Действие. Здесь вы можете написать Java код, который будет выполняться при происхождении этого события. Возможно, более удобно будет задать это действие с помощью функции и поместить сюда вызов этой функции.
  5. Выберите режим события из выпадающего списка Режим:
    • Срабатывает один раз — событие будет происходить только один раз, по прошествии времени, заданного в поле Время срабатывания (абсолютное). Вы можете задать время срабатывания как модельную дату или как количество единиц модельного времени, которое должно пройти с момента запуска модели. Демо-модель: Slow Down Simulation on Particular Date Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.
      Обратите внимание, что здесь вы задаете абсолютное время, и в том случае, если событие будет создано уже после указанного здесь момента модельного времени, это событие не произойдет никогда.
    • Циклический — событие будет происходить циклически. С помощью приведенных ниже элементов управления вы можете задать Время первого срабатывания (абсолютное) и Период, с которым будет срабатывать это событие. Вы можете задать время первого срабатывания как модельную дату или как количество единиц модельного времени, которое должно пройти с момента запуска модели. Демо-модель: Event Writes to the Log Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.
      Обратите внимание, что здесь вы задаете абсолютное время, и в том случае, если событие будет создано уже после указанного здесь времени первого срабатывания, модель запланирует первое срабатывание этого события в прошлом и затем будет последовательно увеличивать это значение на величину заданного для события периода. Первое из полученных таким образом значений, которое будет больше текущего значения модельного времени, будет принято в качестве действительного времени первого срабатывания этого события. Следующее срабатывание события будет запланировано, как и положено, путем добавления к этому моменту заданного для события Периода.
      Если вы хотите использовать относительные времена (т.e. отсчитывать время первого срабатывания от момента создания этого события), используйте функцию time() в поле Время первого срабатывания (абсолютное). Здесь функция time() будет возвращать модельное время создания этого события.
    • "Ручной" — событие будет работать в «ручном» режиме, то есть его работой будет управлять сам пользователь путем вызова соответствующих методов этого события. Такое событие произойдет тогда и только тогда, когда пользователь вызовет метод события restart(), которому передаст в качестве аргумента значение таймаута, например: myEvent.restart(15).
      Если таймаут не меняется и известен заранее, то вы можете указать его в поле Таймаут. Тогда вы сможете просто вызывать метод myEvent.restart(), не указывая таймаут с помощью аргумента этого метода.
      Демо-модель: Event for Automatic Shutdown Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Свойства

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

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

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

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

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

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

По таймауту — Событие происходит по истечении таймаута. Событие будет происходить согласно выбранному Режиму.
С заданной интенсивностью — Событие происходит с заданной интенсивностью (которая задается в поле Интенсивность).
При выполнении условия — Событие происходит при выполнении заданного условия (которое задается в поле Условие).

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

"Ручной" — вы будете самостоятельно управлять событием, планируя его происхождение на нужные вам моменты времени. Такое событие будет происходить только при вызове пользователем метода 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) возвращает оставшееся время в минутах.
Как мы можем улучшить эту статью?