Программное управление выполнением модели

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

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

Чтобы вызвать функцию исполняющего модуля, напишите, например, getEngine().finish() в соответствующем месте кода вашей модели.

Или же вы можете вызвать аналогичную функцию  finishSimulation() из любой активности агента вашей модели.

Функция исполняющего модуля

Функция агента

Краткое описание

Полное описание

boolean start() нет Запускает модель (если она еще не была запущена) и приостанавливает ее выполнение.

Команда исполняющего модуля, выполняемая только в том случае, если модуль находится в состоянии IDLE (в других состояниях не делает ничего, просто возвращает false). 

Метод выполняет следующее:

1. Устанавливает время запуска модели.
2. Создает необходимое содержимое агента верхнего уровня путем вызова метода root.create();
3. Запускает модель (планирует первые события) путем вызова метода root.start();
4. Переводит исполняющий модуль в состояние паузы PAUSED.

boolean pause()

boolean pauseSimulation()

Приостанавливает запущенную модель. Переводит исполняющий модуль в состояние PAUSED после завершения выполнения текущего события.

Команда исполняющего модуля, выполняемая только в том случае, если модуль находится в состоянии RUNNING (в других состояниях не делает ничего, просто возвращает false). Переводит исполняющий модуль в состояние PLEASE_WAIT и затем выставляет флаг, который при проверке исполняющим модулем, вынуждает его завершить выполнение после завершения выполнения текущего события. Дальнейшее поведение зависит от контекста, из которого был вызван этот метод:

  • Если этот метод вызывается из потока выполнения модели, из кода действия элемента управления или из действия по щелчку фигуры, то он мгновенно возвращает true. Модель приостанавливается сразу после выполнения текущего события.
  • Если этот метод вызван из какого-либо другого места (например, из заданного пользователем параллельного потока), то он ждет завершения потока выполнения модели и возвращает true.

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

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

boolean run() boolean runSimulation() Запускает приостановленную модель. Переводит исполняющий модуль в состояние RUNNING и затем возобновляет выполнение модели.

Команда исполняющего модуля, выполняемая только в том случае, если модуль находится в состоянии PAUSED (в других состояниях не делает ничего, просто возвращает false). Переводит исполняющий модуль в состояние RUNNING и затем запускает модель в отдельном потоке. Выполнение может быть прервано в результате одного из следующих событий:

- больше нет событий, которые нужно выполнить (состояние -> FINISHED)

- достигнуто конечное время stopTime (состояние -> FINISHED)

- был вызван метод pause() (состояние -> PAUSED)

- агент верхнего уровня был уничтожен (состояние -> FINISHED)

- во время выполнения события или уничтожения агента произошло исключение (состояние -> ERROR)

Этот метод не должен вызываться из потока выполнения модели!

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

Возвращает:
false , если текущее состояние исполняющего модуля не позволяет произвести запуск модели

boolean stop()

boolean stopSimulation()

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

Команда исполняющего модуля, выполняемая только в том случае, если модуль не находится в состоянии IDLE (в состоянии IDLE не делает ничего, просто возвращает false). Если модуль находится в состоянии RUNNING, то устанавливает флаг, который при проверке потоком выполнения модели, вынуждает исполняющий модуль завершить выполнение модели. Дальнейшее поведение зависит от контекста, из которого вызван этот метод:

  • Если этот метод вызывается из потока выполнения модели, из кода действия элемента управления или из действия по щелчку фигуры, то он мгновенно возвращает true, оставляя модуль в состоянии PLEASE_WAIT. Модель останавливается и уничтожается позднее (обработку этого момента можно добавить в Действие после "прогона" модели эксперимента или в Действие при уничтожении агента верхнего уровня). В таких ситуациях рекомендуется использовать метод finish().

  • Если этот метод вызван из какого-либо другого места (например, из заданного пользователем параллельного потока), то он ждет завершения потока выполнения модели, затем уничтожает модель (путем вызова root.onDestroy()) и "забывает" о ней. Затем переводит исполняющий модуль в состояние IDLE и возвращает true.

boolean finish()

boolean finishSimulation()

Завершает выполнение запущенной или приостановленной модели. В отличие от метода stop() модель при этом не уничтожается, и вы можете анализировать ее состояние.

Команда исполняющего модуля, выполняемая только в том случае, если модуль находится в состоянии RUNNING или PAUSED (в других состояниях не делает ничего, просто возвращает false). Устанавливает флаг, который при проверке исполняющим модулем, вынуждает его завершить выполнение после завершения выполнения текущего события. Дальнейшее поведение зависит от контекста, из которого вызван этот метод:

  • Если этот метод вызывается из потока выполнения модели, из кода действия элемента управления или из действия по щелчку фигуры, то он мгновенно возвращает true. Модель останавливается сразу после выполнения текущего события (обработку этого момента можно добавить в Действие после "прогона" модели эксперимента.
  • Если этот метод вызван из какого-либо другого места (например, из заданного пользователем параллельного потока), то он ждет завершения потока выполнения модели и возвращает true.

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

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

boolean runFast()

нет

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

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

Метод завершает свое выполнение в результате одного из следующих событий:

- недопустимое состояние исполняющего модуля в момент вызова метода (возвращает false, во всех остальных случаях возвращает true)

- больше нет ни одного события/уравнения, которые нужно выполнить/решить (state -> FINISHED)

- был вызван метод pause() (состояние -> PAUSED)

- был вызван метод finish() (состояние -> FINISHED)

- достигнуто конечное время stopTime (состояние -> FINISHED)

- агент верхнего уровня был уничтожен (состояние -> FINISHED)

- во время выполнения события или уничтожения агента произошло исключение (состояние -> ERROR)

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

Возвращает:
false, если текущее состояние исполняющего модуля не позволяет произвести запуск модели

boolean step()

нет

Выполняет не более одного дискретного шага модели (шаг может быть выполнен только из состояния паузы PAUSED). 

Выполняет не более одного дискретного шага модели (шаг может быть выполнен только из состояния паузы PAUSED). 

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

Этот метод не должен вызываться из потока выполнения модели!

Возвращает:
false, если текущее состояние исполняющего модуля не позволяет произвести выполнение шага

int getState()

нет

Возвращает текущее состояние исполняющего модуля (IDLE, PAUSED, RUNNING, STEP, FINISHED или ERROR). 

Возвращает текущее состояние исполняющего модуля:

IDLE - не выполняется ни одна из моделей, ничего не происходит

PAUSED - модель была выбрана и уже запущена, а в данный момент готова к продолжению выполнения или к выполнению шага

RUNNING - находится в цикле выполнения модели, вызванного методом run() или runFast()

FINISHED - выполнение модели успешно завершено, но модель еще не уничтожена

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

PLEASE_WAIT - находится в процессе выполнения непрерываемой команды, такой, как pause(), step() или stop()

Обратите внимание, что актуальность возвращаемого состояния не гарантируется, поскольку оно может быть изменено из параллельного потока.