1

データが入ってくるシリアルポートがあります。シリアルポートイベントリスナーを使用して、RXTXライブラリとのシリアルポート接続を実装しました。そのため、シリアル ポートで使用可能な受信データがある場合は常に、同期関数 serialEvent(SerialPortEvent oEvent) が実行されます。基本的に、データが継続的に入ってくるため、プログラムは無限ループになります。受信データを整数の配列に整理しました。ここで、この配列を他のクラスと共有して、この配列を使用してさまざまなタスクを実行したいと考えています。シリアル イベント リスナーがループで実行され、配列が変化し続けるため、他のすべてのクラスでこの変更された配列データを共有したいと言えます。以前に java.util.observables について学んだことがあります。また、オンラインで検索すると、sychronized () および notify()/notifyAll() を使用してスレッド間で変数を共有している人もいます。

どちらを使用するのが最適かわかりません。この場合、両方が機能する場合、私が注意する必要がある最も重要な部分は何ですか? 私が望むものを達成する他の方法はまだありますか?

4

3 に答える 3

0

あなたの質問は非常に不明確ですが、一般的なアドバイスを 1 つだけお伝えできます。

シリアル ポート オブジェクトを使用する簡単な方法は、入力ストリームまたは出力ストリームを開き、バイトを読み書きするだけです。イベントの内容は、データの読み取りを待機しているスレッドをブロックしたくない場合を対象としています。

これらのRXTX の例、特にストリームとイベント ベースのアプローチを示す最初の 2 つを読むことをお勧めします。

これで解決しない場合は、何をしようとしているのかを説明する Java コードまたは疑似コードで質問を更新してください。

ファローアップ

あなたの「答え」から判断すると、あなたは何をしているのか誤解しているようですsynchronized。簡単に言えば、2 つのスレッドが特定のコード領域を同時に実行するのを止めるだけです。

あなたの問題には、あるスレッドが何らかの方法で別のスレッドに新しいデータが到着し、処理する必要があることを伝えることも含まれます。また、最初のスレッドがデータの次のチャンクでデータを上書きする前に、データを処理する必要があるという問題もあります。

Concurrencyに関する Java チュートリアル ストリームを読むことから始めることをお勧めします。これはおそらくあなたの問題に直接対処するものではありませんが、問題について正しい方法で考えるきっかけになるはずです。

于 2010-11-05T10:51:40.820 に答える
0

私の質問が明確ではなくて申し訳ありません。私が取り組んでいるコードをいくつか与えるべきでした。次のリンクを参照してください。

http://www.arduino.cc/playground/Interfacing/Java

基本的に、このサンプル コードは、一部の関数で "synchronized" キーワードを宣言することにより、シリアル ポートでイベント ベースの通信を行う従来の rxtx の例とは異なります。私が取り組んでいる唯一の部分は、シリアルイベントリスナー内です:

public synchronized void serialEvent(SerialPortEvent oEvent) {

    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            ////////////////////////////////////
            1) I will parse the incoming data into an integer array
            2) this array will be shared with other classes, let me
              explain some of them below.....
            ////////////////////////////////////
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

機能 A: この共有配列のデータを使用して 2D/3D グラフィックを実行するアプレット。

機能 B: GUI は、共有配列から計算されたいくつかの数値を jframe のテキストエリアに出力/印刷します。また、ボタンで Function A アプレットを開くこともできます。しかし、GUI にはいくつかのボタンがあり、関数 A のいくつかの変数を変更して、関数 A によって共有配列を処理するための異なる動作を引き起こします。

これは私が欲しいものです:

シリアルデータが入ってきてデータ配列に解析されると....

1) 関数 B は、このデータ配列に関連付けられた数値をすぐに出力します。ユーザーがボタンをクリックして機能 A アプレットを表示した場合にのみ、機能 A は 2D/3D グラフィックを表示します。

2) 機能 A と B の両方がアクティブな場合、それら自体の変数は受信シリアル データと共に変更される可能性があります。

関数 A と B が、serialEvent() で変更されたときに共有データ配列の変更をすぐにキャッチするようにします。最も簡単な方法は、データ配列を参照として渡し、次の受信データが利用可能になる前に各関数を呼び出すことです。しかし、グロドリゲスが以前に言及した問題があります. 機能 A または B の進行中に、受信データが失われる可能性があります。私は何年も前に Java で MVC について何かをしましたが、それは温度を表示するために異なるクラスまたは GUI 間でオブザーバブルを使用していました。テキストボックスに温度を入力すると、スライダーのある他の GUI が入力温度に変わります。ここでスライダーを変更すると、他の GUI の温度が数値で変更されます。シリアルイベントは、ここでこのアプリケーションを思い出させます。ここで適用するのが最善の方法なのか、それとも私がやりたいことを正確に行うためのより良い簡単な方法があるのか​​ どうかはわかりません.

再度のご理解とご協力をお願いいたします。

于 2010-11-06T00:07:53.743 に答える
0

アプリケーションに関する追加情報がないと、それを判断するのは難しいです。「他のクラス」とは、「他のスレッド」のことですか?

他のクラスがスレッドであり、それらに新しいデータを待機させたい場合は、新しいデータが利用可能になるたびにそれらwait()を使用して、シリアル ポート イベント リスナーを使用できます。notifyAll()これにより、待機中のスレッドが目覚めます。ただし、これは通知を解決するだけであることに注意してください。他のスレッドがアクセスしている間に新しいデータが到着する可能性があるため、データ配列への同時アクセスを処理する必要があります。

一方、 を使用する場合Observable、 を呼び出すと、すべて現在のスレッド ( を呼び出しているスレッド) のコンテキストで、それぞれObservable.notifyObservers()update()メソッドが呼び出されます。他のスレッドがデータにアクセスするようにしたい場合は、何らかの方法でそれらに通知する必要があります (たとえば、メソッドが実際に を呼び出す可能性があります)。ObserverObservable.notifyObservers()update()notify()

あなたが何をしようとしているのかについてより多くの情報を提供していただければ、私たちはさらにあなたを助けることができるかもしれません.

于 2010-11-05T13:01:01.213 に答える