早上好,
使用while循环时遇到问题。让我解释。我必须管理带有红外传感器的灯泡。没问题。 它以这种方式工作:如果注意到一个动作,则指示灯亮起,如果没有注意到动作,则超时将开始,之后,指示灯会熄灭,但是如果在此超时期间发出新的动作,则超时必须停止,“重置”循环。
没有“BUT”条件,使用Tread.sleep很容易管理,但是我试图使用while循环来完成它而没有结果......
这就是我所拥有的,一个无限循环,每秒检查一次传感器状态
while (true) {
try {
if (sensore.getStatoSensore() == 1) { //movement noticed
lampada.accendi(); //light on
} else if (sensore.getStatoSensore() == 0) { //no movement noticed
long start = System.currentTimeMillis();
long end = start + (timeoutSpegnimento * 1000); //10 seconds before lights shut down
boolean movement = false;
while (System.currentTimeMillis() < end) {
logger.debug("Shutdown timer started");
if (sensore.getStatoSensore() == 1) {
movement = true;
lampada.accendi(); //light up
logger.debug("Movement noticed - movement=" + movement);
} else {
movement = false;
}
Thread.sleep(500);
}
if (!movement) {
lampada.spegni(); //light off
}
}
} catch (Throwable e1) {
// TODO Auto-generated catch block
logger.error(e1);
}
try {
Thread.sleep(intervallo * 1000); //do the sensor check once a second
} catch (InterruptedException e) {
// TODO Auto-generated catch block
logger.error(e);
}
}
我遇到了超时循环while (System.currentTimeMillis() < end)
的问题
在我的想法中,它应该以这种方式工作:
如果调用(sensore.getStatoSensore() == 0)
一个周期超时。在此期间,如果没有注意到新的移动,则movement
为false,因此调用lampada.spegni();
。这部分效果很好。
但是这个if环境中的条件
if (sensore.getStatoSensore() == 1) {
movement = true;
lampada.accendi(); //light up
logger.debug("Movement noticed - movement=" + movement);
只是第一次工作,而不是初始,而(真)循环搞砸了,总之,我再也无法得到正常的行为了。我希望这能更好地解释我正在寻找什么
答案 0 :(得分:1)
当您在等待超时时发现移动时,您没有重置超时,就像您在说明中所说的那样。
当灯仍然在等待超时到期时,请勿结合等待第一个动作。它们是完全不同的东西,你不应该试图放在一个循环中,即使你设法让它工作。
优选地,它们甚至应该采用不同的,有名的方法。
我已经第一次尝试清理你的代码了,并且如果在灯亮的时候有移动,也会重置超时。那应该对你有帮助。
servlet-mapping
答案 1 :(得分:0)
如果无限循环不是你的问题,那就不用Thread.sleep:
long lastMovement = 0L;
while (true) {
try {
if (sensore.getStatoSensore() == 1) { //movement noticed
lampada.accendi(); //light on
lastMovement = System.currentTimeMillis();
} else if (sensore.getStatoSensore() == 0) { //no movement noticed
long end = lastMovement + (timeoutSpegnimento * 1000); //10 seconds before lights shut down
if (end > System.currentTimeMillis() && lastMovement > 0) {
lampada.spegni(); //light off
lastMovement = 0L;
}
}
} catch (Throwable e1) {
// TODO Auto-generated catch block
logger.error(e1);
}
try {
Thread.sleep(intervallo * 1000); //do the sensor check once a second
} catch (InterruptedException e) {
// TODO Auto-generated catch block
logger.error(e);
}
}
答案 2 :(得分:0)
我认为添加一个方法(如“lampada.isOn()”)可以随时指示灯的状态(ON / OFF)。 例如,在您的情况下,当灯泡已经关闭时,无需检查超时。我认为无限循环来自这个永久性检查