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

Иногда вам может понадобиться программно управлять выполнением вашей модели. Например, приостановить ее выполнение при происхождении какого-либо события и возобновить выполнение при срабатывании определенного перехода диаграммы состояний. Или же вам может понадобиться возможность запуска модели по нажатию на вашу собственную кнопку. 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)

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

- была вызвана функция pause() (состояние -> PAUSED)

- была вызвана функция finish() (состояние -> FINISHED)

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

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

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

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

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

boolean step()

нет

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

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

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

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

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

Engine.State getState()

нет

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

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

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

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

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

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

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

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

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

boolean getRealTimeMode()

нет

Возвращает текущий режим выполнения модели.

Возвращает true, если на данный момент модель выполняется в режиме реального времени. Если модель выполняется в режиме виртуального времени, функция возвращает false.

void setRealTimeMode
(boolean on)

нет

Задает режим выполнения модели: в виртуальном времени или в реальном времени.

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

Параметр:
on - если значение равно true, то модель будет выполняться в режиме реального времени с заданным коэффициентом скорости моделирования.

double getRealTimeScale()

нет

Возвращает текущий коэффициент скорости моделирования.

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

Этот коэффициент применим, только если модель выполняется в режиме реального времени.

void setRealTimeScale
(double scale)

нет

Задает коэффициент скорости моделирования.

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

Этот коэффициент применим, только если модель выполняется в режиме реального времени.

Параметр:
scale - новый коэффициент скорости моделирования.