0

今日はすでに質問を投稿しました。この質問は同じプロジェクトに関するものですが、無関係です。レゴ NXT マインドストーム ロボット用のアプリケーションを開発しています。PC で 2 つのロボットと GUI を実行しています。

leJOS NXJ では、1 つの入力リーダーしか使用できません。つまり、PC を 2 台のロボットに直接接続することはできず、2 台のロボットを直接接続させることができません。これが私がやったことです。PC を 2 台のロボットに直接接続し、2 台のロボットが直接通信したい場合は、GUI を介してメッセージを送信します。

GUI とロボットの間だけでなく、ロボット同士の間でも多くの通信が行われます。このため、出力ストリームにデータを書き込むたびに、一部のデータが他のデータによって上書きされ、システムが正常に動作していないように見えます。

コレクション(キュー)オブジェクトを保持するクラスを作成して、ロボットが何かを送信したいときはいつでもそれをコレクション(キュー)に追加し、コレクションオブジェクトを保持するそのクラスから、メソッドを使用して、コレクションを常にチェックし、コレクションが空でない場合は常に、コレクション内のデータを出力ストリームに送信します。

これは、コレクション内のデータが出力ストリームに送信されるたびに、新しいデータが追加される可能性があることを意味します。

ArrayBlockQueue などを使用することを提案した人もいますが、これらのクラスは、ロボットが使用する class.jar ファイルでは使用できません。

この jar ファイルで私が知っているコレクション クラスは、Vectors と Queue です。

そのようなクラスを実装する方法のアイデアを教えてくれる人がいるかどうかを尋ねています。クラスのメソッドは、コレクション内にデータがあるかどうかを時々チェックし、出力ストリームを介してそれらを送信します。を送信している間、新しい要素が追加されている可能性があります。

データはある場所から送信されているため、データが他の場所を上書きすることはありません。私には良い考えに思えます。

すべての提案を歓迎します。

ありがとう。

4

1 に答える 1

0

Vector が優れているのは (少なくとも JavaSE では - Mindstorms が何を使用しているのかわかりません) 同期されているため、すべての呼び出しがアトミックです。Vector から削除するときに別のスレッドが Vector に何かを追加しようとすると、それまでブロックされます。データが失われる可能性がある問題を回避して終了しました。

または、 Collections クラスの同期ラッパーを確認することもできます。

または、標準の Queue をサブクラス化して、ブロッキング キューを独自に実装することもできます。より複雑ではありますが、ブロッキング キューはより良い解決策です。キューを繰り返しチェックし、そのたびに空であると通知されるビジー状態の待機を回避できるからです。

于 2010-07-28T19:55:43.240 に答える