关于动态事件
动态事件和事件之间的区别在于,动态事件在执行其操作后会自行删除,而用户控制的事件会继续存在并可以重新启动。
AnyLogic 会给添加到关系图中的每个动态事件生成一个 Java 类,因此应遵循 Java 命名约定。动态事件的起始名称以大写字母开头。
动态事件可以传递参数。
创建动态事件实例
当创建了一个动态事件后,需要创建动态事件实例,来使用它。
要计划动态事件的一个新实例,请使用 AnyLogic 为每个动态事件自动生成的函数:
create_dynamic_event_name(超时、时间单位、参数 1、参数 2、...)
例如,动态时间名为Watering,则可以调用函数create_Watering(15, MINUTE),如果指定了模型时间单位,则可以简写为create_Watering(15)
使用create_...()函数创建动态事件实例,是唯一合法的方式。
没有访问动态事件的简便方式,getDynamicEvents()会得到包含所有动态事件的列表,
最好自行保存动态事件的引用, MyDynamic de = create_MyDynamic(7.5);
例1:不带参数的动态事件 |
假设模型时间单位为秒 |
a.拖拽一个动态事件,改名为Watering,没有任何参数,代码如图:
|
此时,需要创建动态事件的实例,来使用动态事件 |
下面的两个方法,是Anylogic在检测到动态事件Watering后,自动生成的,用户只需调用,即可创建动态事件的实例。同时,可以传入时间参数,控制该实例在多少时间后触发。 这也是创建动态事件实例的唯一方式。 |
create_Watering( double timeout )
(没有指定时间单位,则默认为模型时间单位) |
创建一个动态事件的实例,该实例在timeout个模型时间单位后,触发。
例:create_Watering(20) 假设模型时间单位为秒,则该方法创建一个动态事件实例,计时20秒后触发。 |
create_Watering(double timeout, TimeUnits units) |
创建一个动态事件的实例,该实例在timeout时间后触发,单位为units。
例: create_Watering(1, MINUTE) 创建一个动态事件实例,该实例在1分钟后触发。 |
b.为了方便演示,添加一个button,一个event,如图设置
|
点击button后,倒计时20秒,event会输出“----到时20秒----”, 同时动态事件实例会输出“----浇水----”
运行模型,点击button,结果与预期相符。
|
例2: 带有参数的动态事件 |
a.参数 只需要修改动态事件Watering,添加参数即可。 在属性面板“参数”中,点击第一个单元格,即可输入参数名;点击第二个单元格即可输入参数的类型,也可通过在下拉框中选择自动给出的类型,如图:
|
点击第二行的第一个单元格,即可添加第二个参数。 也可以通过点击来添加参数;点击一个参数,再点击,即可删除参数; 有多个参数时,点击一个参数,再点击即可调整参数顺序(当向动态事件传递参数时,必须按照这个顺序)
这里为了简单演示,只添加一个参数name,类型为String。 |
b.修改代码,输出参数name
|
c.修改button代码 在create_Watering(....)的时候,传入了参数“小明”
|
|
此时可以使用以下方法创建实例,传递一个参数
create_Watering( double timeout , 参数)
(没有指定时间单位,则默认为模型时间单位) |
创建一个动态事件的实例,该实例在timeout个模型时间单位后,触发。
例:create_Watering(20,”小明”) 假设模型时间单位为秒,则该方法创建一个动态事件实例,计时20秒后触发。 |
create_Watering(double timeout, TimeUnits units, 参数) |
创建一个动态事件的实例,该实例在timeout时间后触发,单位为units。
例: create_Watering(1, MINUTE, “小明”) 创建一个动态事件实例,该实例在1分钟后触发。 |
|
|
扩展,多参数时,只需: create_Watering( double timeout , 参数1,参数2,...., 参数n) create_Watering(double timeout, TimeUnits units, 参数1,参数2,....,参数n)
|
|
d.运行模型,点击button
|
需要注意的是,create_Watering(...)方法,每次都会创建一个新的动态事件实例,在执行其操作后会自行删除。 而event只是restart()重启,每次使用的还是同一个event。
|