我目前使用Lego NXT 2.0
固件编译leJOS 0.9.1 beta
。
我有几种不同的传感器,如颜色传感器和超声波传感器。
我正在使用while循环让机器人向前行驶,直到撞到墙壁。但是,出于某种原因,我不喜欢这种方法,而是希望实现一个监听器。然而,leJOS开发人员写道,不推荐使用监听器模型,我应该使用线程来轮询超声波传感器的值。
现在我想知道while循环的实现有多糟糕(操作系统明智,如浪费资源)以及线程模型如何更有益(并实现)?
MWE:
public class SensorTest {
static UltrasonicSensor sonic;
static DifferentialPilot pilot;
public static final int DISTANCE = 20;
public static void main(String[] args){
sonic = new UltrasonicSensor(SensorPort.S1);
pilot = new DifferentialPilot(8.5, 25, Motor.C, Motor.B);
int i = 0;
while (i < DISTANCE) {
pilot.forward();
i = sonic.getDistance();
}
pilot.stop();
}
}
答案 0 :(得分:2)
对乐高积木没有任何经验(我非常嫉妒),你必须问自己一些严肃的问题。
在一个简单的情况下,以这种方式使用循环可能不是一个糟糕的解决方案,但随着您添加更多,处理每个请求所花费的时间(检查n个传感器,执行n个操作),反应会变慢。
Threaded模型可能允许您处理更多数据,但您可能需要考虑需要多少线程以及它们正在做什么。
例如,您可以拥有一个Driver
主题,其唯一责任是移动乐高。这样做可以查询一些“传感器”线程来确定它所说的内容,但每个传感器线程都会以自己的速率轮询数据而不关心其他任何事情。
你也可以反转模型,允许Driver
继续移动,直到Sensor
线程提出某种警报并告诉Driver
它应该改变方向。
我个人会试图看看我是否可以使线程模型工作(即使对于一个简单的设备),因为它将为未来扩展操作提供更大的灵活性......
在一天结束时,它将是平衡行为
严重嫉妒!
答案 1 :(得分:0)
现在我想知道while循环的实现有多糟糕 是(操作系统明智,如浪费资源)和如何 线程模型会更有益(并实现)?
'线程模型'是一个while循环,在主线程以外的某个线程上执行。如果你担心资源消耗,你可以让线程在再次轮询一个值之前进入休眠状态一段时间。
至于如何实现,你必须阅读API
,但在标准的java程序中,如果你使用的是新的JDK,你只需要创建一个实现{的类。 {1}}接口,并将此对象传递给线程执行程序。
答案 2 :(得分:0)
使用线程与轮询取决于您的情况。我想在编程微控制器时,一个线程更像是一个中断。使用线程(或中断),您可以更好地模块化代码,使其更有效。见这个帖子 -