0

私は現在Lego NXT 2.0leJOS 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();
      }
}
4

3 に答える 3

2

レゴブロックの経験がないので(私は真剣に嫉妬しています)、いくつかの深刻な質問を自問する必要があります.

単純な状況では、この方法でループを使用することは悪い解決策ではないかもしれませんが、さらに追加すると、各要求の処理 (n 個のセンサーのチェック、n 個の操作の実行) にかかる時間が長くなるにつれて、次のようになります。反応が遅くなります。

スレッド モデルを使用すると、より多くのデータを処理できる場合がありますが、必要なスレッドの数とその実行内容を考慮する必要がある場合があります。

たとえばDriver、レゴを動かすことだけを担当するスレッドを作成できます。これは、多くの「センサー」スレッドにクエリを実行して何を伝えているかを判断しますが、各センサースレッドは独自の速度でデータをポーリングし、他のことは気にしません。

また、モデルを逆にして、スレッドが何らかの警告を発し、方向を変えるように指示Driverするまで、 が動き続けることもできます。SensorDriver

私は、個人的には、操作を拡張するための将来の柔軟性を提供するため、(単純なデバイスの場合でも) スレッド モデルを機能させることができるかどうかを確認しようとしています...

結局のところ、それはバランスをとる行為になるでしょう

本気で嫉妬!

于 2013-01-29T01:02:08.593 に答える
0

ここで、whileループを使用した実装が実際にどれほど悪いか(リソースの浪費のようにオペレーティングシステムに関して)、スレッドモデルがどのように有益(および実装)になるのか疑問に思っていますか?

「スレッドモデル」はwhileループであり、メインスレッド以外のスレッドで実行されます。リソースの消費が心配な場合は、スレッドが値を再度ポーリングする前に、一定の間隔でスレッドをスリープ状態にすることができます。

これがどのように実装されているかについては、を読む必要がありますがAPI、標準のJavaプログラムでは、新しいJDKを使用している場合は、Runnableインターフェイスを実装するクラスを作成し、このオブジェクトをスレッドに渡します。エグゼキュータ。

于 2013-01-29T00:56:24.270 に答える
0

スレッドとポーリングの使用は、状況によって異なります。マイクロコントローラーをプログラミングするとき、スレッドは割り込みのように振る舞うと思います。スレッド (または割り込み) を使用すると、コードをより適切にモジュール化して、より効率的にすることができます。このスレッドを参照してください-

ポーリングまたは割り込みベースの方法

于 2013-01-29T00:59:35.093 に答える