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.
时提高可读性
如果没有光通过任何光传感器,我会尝试让我的代码退出。
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.
时提高可读性