如何在输出元素中获取makespan时间?仿真停止失效问题排查
AnyLogic仿真停止与时间显示问题解答
问题描述
我在Main模块的销毁事件中编写了如下代码:
// Stop the simulation when all the jobs are done if (jobs.size() == 0) { makespan = time(); getEngine().finish(); // Pausiere die Simulation getEngine().getState(); }
遇到两个技术问题:
- 调用
getEngine().finish()后,仿真并未停止,时间仍在持续运行 - 已配置输出元素和文本元素显示时间,但即使手动停止模型也无法获取该时间,推测是上述代码未生效导致
问题1:getEngine().finish()无法停止仿真的原因及修复
核心问题:销毁事件的触发逻辑不匹配
销毁事件(Destroy Event)仅在Main模块被销毁的瞬间执行一次,而非仿真运行过程中持续监控jobs集合状态。如果你的Main模块全程没有被销毁,这段代码根本不会执行,自然无法触发停止操作。
另外,getEngine().getState()只是获取当前仿真状态,不会对停止逻辑产生任何作用,可以直接删除。
修复方案
将监控逻辑移到**循环事件(Cyclic Event)**中,设置一个极小的触发间隔(比如0.1时间单位),让仿真持续检查任务状态:
// 在循环事件中编写的代码 if (jobs.size() == 0) { makespan = time(); getEngine().finish(); }
同时确认jobs集合确实包含了所有需要监控的任务,没有遗漏未加入的任务实例。
问题2:无法获取显示时间的修复
核心原因
要么是代码未执行(比如销毁事件没触发),要么是makespan变量与UI元素的绑定存在问题。
修复方案
- 确保变量可被UI访问:在Main模块的变量面板中,将
makespan设置为公开(Public),这样UI元素能正确读取它的值。 - 覆盖手动停止场景:在仿真的“停止”按钮点击事件中添加
makespan = time();,确保无论自动停止还是手动停止,都能记录当前时间。 - 检查UI绑定设置:
- 输出元素的「Value」属性选择
main.makespan(如果Main模块的实例名为main) - 文本元素的「Text」属性设置为
"" + main.makespan,将数值转为字符串显示
- 输出元素的「Value」属性选择
内容的提问来源于stack exchange,提问作者Mo1409
相关产品推荐
相关产品推荐

