關于動態事件
動態事件和事件之間的區別在于,動態事件在執行其操作后會自行刪除,而用戶控制的事件會繼續存在并可以重新啟動。
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。 ? |
?
?
?