如何获取AnyLogic中Delay模块的剩余延迟时间?
AnyLogic Delay模块获取代理延迟时间问题解决
问题原因分析
你遇到的报错本质是对AnyLogic Delay模块的API调用方式理解有误:
getRemainingTime()、getDelayTime()、getElapsedTime()这些方法必须传入当前在Delay模块内的代理实例,无参调用不存在,所以直接调用会报错- 直接写
Detail是代理类型名,不是具体的代理变量,自然无法解析 Delay.get(0)本身是获取模块内第一个代理的正确方式,但你可能没搭配正确的方法调用格式,或者调用时机不对(代理还没进入模块时get(0)返回null)
解决方案
假设你的Delay模块变量名为myDelay(建议不要用默认的delay或首字母大写的名称,避免混淆),容量为1,按以下步骤操作:
确保调用时机正确
只有当代理处于Delay模块内时,这些方法才有意义。推荐在以下场景调用:- Delay模块的
On enter事件(代理刚进入时) - Delay模块的
On exit事件(代理即将离开时) - 定时触发的事件(需要先判断
myDelay.size() > 0,避免空指针)
- Delay模块的
正确调用方法的格式
以获取当前在Delay内的代理为例:// 先判断模块内有代理 if(myDelay.size() > 0){ // 获取模块内的代理(容量1时index为0) Agent currentAgent = myDelay.get(0); // 如果是自定义代理类型Detail,可强转: // Detail currentAgent = (Detail)myDelay.get(0); // 获取总延迟时间(设置的或动态计算的) double totalDelay = myDelay.getDelayTime(currentAgent); // 获取已流逝的延迟时间 double elapsedTime = myDelay.getElapsedTime(currentAgent); // 获取剩余延迟时间 double remainingTime = myDelay.getRemainingTime(currentAgent); // 后续可将这些值存入代理属性或打印输出 // 比如存入Detail代理的自定义属性: ((Detail)currentAgent).totalDelay = totalDelay; }在On enter事件中直接使用当前代理
在Delay的On enter事件里,系统会自动提供agent变量,代表刚进入的代理,直接用更简单:Detail currentAgent = (Detail)agent; // 获取该代理的总延迟时间 double totalDelay = myDelay.getDelayTime(currentAgent); // 已流逝时间此时为0,剩余时间等于总延迟时间 double remainingTime = myDelay.getRemainingTime(currentAgent);
常见错误修正
- 错误:
myDelay.getRemainingTime()→ 修正为myDelay.getRemainingTime(currentAgent)(必须传代理参数) - 错误:直接写
Detail→ 修正为获取具体的代理实例(如(Detail)agent或(Detail)myDelay.get(0)) - 错误:
Delay.getRemainingTime(Delay.get(0))→ 确保模块名正确(如果模块名是Delay,首字母大写不建议,改成小写的delay或myDelay,避免和类名混淆)
内容的提问来源于stack exchange,提问作者Alex Lukoyanov
相关产品推荐
相关产品推荐

