如何获知Anylogic模型执行剩余时间并实现运行进度实时展示?
问题解答:通过
traceln实现AnyLogic运行进度与剩余时间捕获 首先明确:traceln()是AnyLogic内置的日志输出函数,仅负责将自定义内容输出到控制台/运行日志,本身没有直接计算、返回模型剩余执行时间的能力,你需要结合实验总时长、当前运行进度自行计算对应数值后,通过traceln()按照固定格式输出,再被VBA捕获解析即可实现进度条展示需求。
1. AnyLogic 模型端配置
- 首先确认实验的总计量维度:如果是单次仿真实验,预设总模拟时长
totalSimTime(和你模型设置的仿真结束时间、时间单位完全一致即可);如果是参数变化/多次重复实验,额外记录总迭代次数totalIterations。 - 在模型中添加周期性触发的事件,触发间隔根据你需要的进度更新频率设置(例如每模拟1天触发1次,或每完成1次迭代触发1次)。
- 事件的动作代码写入如下逻辑,按照固定格式输出进度信息:
// 计算当前进度百分比 double progress = getEngine().getTime() / totalSimTime * 100; // 计算预估剩余模拟时间,可自行转换为秒/分钟等物理时间单位 double remainingSimTime = totalSimTime - getEngine().getTime(); // 用特殊标识头输出,方便后续VBA匹配解析 traceln(String.format("PROGRESS_UPDATE::%.2f::%.2f", progress, remainingSimTime));
- 导出模型为可运行jar包时,确保开启控制台输出权限,无需额外限制stdout输出。
2. VBA 端捕获进度逻辑
触发jar运行时不要使用默认的Shell异步调用,改用WScript.Shell的Exec方法捕获运行时的标准输出流,参考代码如下:
Dim wsh As Object Set wsh = VBA.CreateObject("WScript.Shell") Dim exec As Object ' 替换为你的jar文件实际存储路径 Set exec = wsh.Exec("java -jar ""C:\你的模型路径\exported_model.jar""") ' 循环读取jar运行的输出内容 Do While exec.Status = 0 If Not exec.StdOut.AtEndOfStream Then Dim outputLine As String outputLine = exec.StdOut.ReadLine ' 匹配我们自定义的进度输出标识 If InStr(outputLine, "PROGRESS_UPDATE::") > 0 Then Dim parts() As String parts = Split(outputLine, "::") Dim currentProgress As Double currentProgress = Val(parts(1)) Dim remainingTime As Double remainingTime = Val(parts(2)) ' 此处更新你的进度条控件与剩余时间展示文本 UserForm1.ProgressBar1.Value = CInt(currentProgress) UserForm1.RemainTimeLabel.Caption = "预估剩余时间:" & remainingTime & " 天" DoEvents ' 避免界面卡顿无响应 End If End If ' 增加1秒延迟避免占用过高CPU Application.Wait Now + TimeValue("00:00:01") Loop
注意事项
- 上述方案的剩余时间预估基于模型模拟速度稳定的前提,如果你的模型不同阶段计算复杂度差异很大,可加入物理运行时间加权修正:记录模型启动的物理时间,结合当前进度计算平均模拟速度,再换算为剩余物理时间展示,偏差会更小。
- 如果是多重复运行的实验,需要把总重复次数纳入进度计算逻辑,避免进度只统计单次运行的占比。
内容的提问来源于stack exchange,提问作者Sparsh Choudhary
相关产品推荐
相关产品推荐

