Java - 添加定时闭包

时间:2015-02-05 23:06:17

标签: java time finch

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

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毫秒就会停止运行,但这似乎不起作用。

这是使用finch 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;

3 个答案:

答案 0 :(得分:0)

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

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 :(得分:0)

有几件事:

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)你想继续循环,而没有障碍&#34; AND &#34;经过时间&lt; 5000)。换句话说,如果 EITHER 为真,那么你想退出&#34; while()&#34;循环。

3)你可能还想设置&#34; endProgram&#34; &#34;真&#34;当&#34;没有光&#34; OR &#34;超过了经过的时间&#34;

答案 2 :(得分:0)

您错过了实际计算。您需要检查自计算WaitingTime值的时间(在类加载时发生)以及实际验证时间的时间,这发生在循环条件上(就像Andy在答案中所说的那样) )。 根据System.currentTimeMillis()文档:

  

返回:       当前时间与1970年1月1日午夜时间之间的差异,以毫秒为单位。

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

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

其中startTime是您的初始时间。

此外,如果您发现自己在时间窗口或System.nanoTime()中需要额外的准确性,则可能更喜欢使用TimeUnit。SECONDS将秒转换为毫秒的方法,这可以提高处理较大窗口时的可读性