Java - while循环检查状态并退出

时间:2015-12-22 10:01:14

标签: java while-loop

早上好,

使用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);

只是第一次工作,而不是初始,而(真)循环搞砸了,总之,我再也无法得到正常的行为了。我希望这能更好地解释我正在寻找什么

3 个答案:

答案 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)。 例如,在您的情况下,当灯泡已经关闭时,无需检查超时。我认为无限循环来自这个永久性检查