在 for 循环中,我通过检索和处理车辆信息来控制基于模拟步骤的交通模拟器 SUMO。为了确保我的程序“实时”模拟(1 个模拟步骤 = 1 秒),我想在处理阶段之后让我的程序休眠,直到下一个时间步骤开始。为了获得更好的结果,我正在根据最初采用的参考时间戳计算时间戳。
循环如下所示:
System.out.println("start of traffic simulation ...");
for (int i = 0; i < stepCount; i++)
{
System.out.println("step: " + i);
// set before timeStamp
beforeTimeStamp = System.currentTimeMillis();
if (firstStep)
{
// get reference timeStamp
referenceTimeStamp = beforeTimeStamp;
firstStep = false;
}
else
{
// get next vehicleVector
vehicleVector = masterControl.traCIclient.simulateStep();
}
// process vehicleVector
// set after timeStamp
afterTimeStamp = System.currentTimeMillis();
processingTime = afterTimeStamp - beforeTimeStamp;
// calculate sleepTime
sleepTime = referenceTimeStamp + ((i + 1) * 1000) - afterTimeStamp;
// sleep for sleepTime ms
Thread.sleep(sleepTime);
}
System.out.println("end of traffic simulation ...");
这是一些变量的输出:
步数:0 前时间戳 1252317242565 参考时间:1252317242565 处理时间:394 测试时间:1252317243565 后时间戳 1252317242959 睡眠时间:606 第1步 前时间戳 1252317242961 处理时间:665 测试时间:1252317244565 后时间戳 1252317243626 睡眠时间:939(预计:1000 - 665 = 335)
如您所见,睡眠时间仅对第一个模拟步骤是正确的。我不知道我在这里可能出了什么问题。有人有想法吗?
BR,
马库斯