Java - 添加定时关闭

Java - Adding timed closure

如果没有光通过任何光传感器,我会尝试让我的代码退出。

import edu.cmu.ri.createlab.terk.robot.finch.Finch;


public class RunProgram {

public static Finch LeFinch = new Finch();

public static boolean endProgram = false;

private static long WaitingTime = System.currentTimeMillis();

public static void main(String args[])
{

    LightSensors lightsensor = new LightSensors();

//do {

        while(ObjectSensor.Obstacle()==false || WaitingTime < 5000)
        {

            if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == true) 
            {
                Movement.forward();
            } 
            else if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == false) 
            {
                Movement.left();
                System.out.println("LEFT");
            } 
            else if (lightsensor.leftsensor() == false && lightsensor.rightsensor() == true) 
            {
                Movement.right();
                System.out.println("RIGHT");
            }
            else if (lightsensor.leftsensor() == false && lightsensor.rightsensor() == false) 
            {
                Movement.stop();
            } 

        }System.out.println("Object Detected");

//  } while(endProgram == false);

}

我尝试使用 System.currentTimeMillis 并创建一个 while 循环,一旦超过 5000 毫秒就会停止 运行,但这似乎不起作用。

这是在使用雀科api。

我已经更新了代码,我决定使用一个计数器,一旦它达到 5000+ 就会终止应用程序

但是,一旦光照到雀鸟上,该值就不会重置。

static long counterTime = 0;

while(counterTime < 5000)
        {

            if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == true) 
            {
                Movement.forward();
                counterTime = 0;
            } 
            else if (lightsensor.leftsensor() == true && lightsensor.rightsensor() == false) 
            {
                Movement.left();
                System.out.println("LEFT");
                counterTime = 0;
            } 
            else if (lightsensor.leftsensor() == false && lightsensor.rightsensor() == true) 
            {
                Movement.right();
                System.out.println("RIGHT");
                counterTime = 0;
            }
            else 
            {
                Movement.stop();
                counterTime = System.currentTimeMillis() - startTime;
                System.out.println(counterTime);
            }

        }endProgram = true;

你需要更新你最后一次看到光的时间(或者你想用来重置超时的任何其他事件):

long lastLightTime = System.nanoTime();
while(ObjectSensor.Obstacle()==false
    || System.nanoTime()-lastLightTime < TimeUnit.SECONDS.toNanos(5)) {
  if (lightsensor.leftsensor() || lightsensor.rightsensor()) {  // Or other condition to reset timeout
    lastLightTime = System.nanoTime();
  }

  // The rest of your loop...
}

为什么System.nanoTime()?这是测量经过时间的正确方法。 (参见 How do I measure time elapsed in Java?)。

几件事:

1) 确保更新已用时间:

public class RunProgram {

  private static long initialTime = System.currentTimeMillis();

  public static void main(String args[]) {
    LightSensors lightsensor = new LightSensors();

    while(ObjectSensor.Obstacle()== false && (SystemcurrentTimeMillis() - initialTime < 5000) {
       ...

2) 你想继续循环 while "no obstacle" AND "elapsed time < 5000). In other words, if EITHER is true, then you want to exit the "while()" loop.

3) 当 "no light" OR "elapsed time exceeded"

时,您可能还想设置 "endProgram" "true"

你错过了实际的计算。您需要检查自计算 WaitingTime 值(在 class 加载时发生)以来经过的时间以及您实际验证时间的时间,这发生在循环条件下(就像 Andy在他的回答中说)。 根据 System.currentTimeMillis() 文档:

Returns: the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC.

所以WaitingTime不是等待时间,是从1月1日开始的时间,也叫大纪元(这是历史原因)。 您需要验证两个值之间的差异,以便估算经过的时间:

while (... System.currentTimeMillis() - startTime < 5000) {
 // 

其中 startTime 是您的初始时间。

此外,您可能更喜欢使用 System.nanoTime() if you find yourself needing extra accuracy in your time windows or TimeUnit.SECONDS 方法将秒转换为毫秒,这可以在处理更大的 windows.

时提高可读性