2016-08-12 20 views
0

シリアルポートに10回連続して書き込む必要があると仮定します。Javaのメソッドとリスナー間の同期実行

for (int i = 1; i <= 10; i++) { 
    serialPort.writeInt(i); 
// wait until SerialPortEventListener receives something then write again 
    } 

か:

void writeMoreDate(){ 
     serialPort.writeInt(something); 
    // wait until SerialPortEventListener receives something then write again 
     serialPort.writeInt(something; 
    // wait until SerialPortEventListener receives something then write again 
     serialPort.writeInt(something); 
} 

そして、私はそれに何かを書くたびに発射し、.MAP()メソッドを呼び出してシリアルポートのイベントリスナーを、持っています。

@Override 
    public void serialEvent(SerialPortEvent event) { 
     if (event.isRXCHAR() && event.getEventValue() > 0) { 

//when data arrived do something and notify that next method can execute!    
     } 
    } 

serialEventが何かを受け取るまでメソッドを待機させるにはどうすればよいですか?

- これは私がjava.util.concurrent.Semaphoreをを使って、今までにこれを取り扱う方法です:

例:

Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS, true); 

     void writeMoreDate(){ 
      Runnable runnable() -> { 
      serialPort.writeInt(something); 
      semaphore.acquire(); 
      serialPort.writeInt(something; 
      semaphore.acquire(); 
      serialPort.writeInt(something); 
      semaphore.acquire(); 
      } 
       new Thread(runnable).start(); 
      } 

およびシリアルリスナーに:

@Override 
    public void serialEvent(SerialPortEvent event) { 
     if (event.isRXCHAR() && event.getEventValue() > 0) { 
       semaphore.release(); 
     } 
    } 

しかし、それが正しい解決策であるかどうかはわかりません。ありがとう。

+0

通常:

だから、あなたの例から、あなたがそれを使用することができます。むしろ、通知の際にリスナーであなたの書き込み呼び出しを行います。 – ControlAltDel

+0

forループで、時間当たり128バイトを書き込むシリアルポートにフラッシュISOイメージを書き込む必要があります。各書き込みの後、リスナーはすべてが正常であることを確認し、これは別の128バイトを送信するフラグです。だから私はforループでこれが必要です。 – Mardari

+0

128バイトが得られるまで読んでから、そのチャンクを書きます。それはなぜ問題なのですか? – ControlAltDel

答えて

0

forループを使用する代わりに、再帰的にやり直してみます。線に沿って何か:

private int activeIndex = -1; 
private int maxIndex = -1; 

private void write(int currentIndex, int maxIndex){ 
    if(maxIndex < currentIndex) 
     return; 

    activeIndex = currentIndex; 
    maxIndex = maxIndex; 

    serialPort.writeInt(currentIndex); 
} 

そして、最後のイベントが終了した後、あなたのイベントリスナーにあなたが次の書き込みイベントをトリガーする...

public void serialEvent(SerialPortEvent event) { 
    if (event.isRXCHAR() && event.getEventValue() > 0) { 
     ..... 

     write(activeIndex + 1, maxIndex); 
    } 
} 

あなたができるならば、それは非常にクリーンになりますどういうわけか、クラス変数を使ってデータを保持するのではなく、現在の/最大のインデックスをSerialPortEventに渡しますが、それが可能かどうかを知るためには、これらのクラスに慣れていません。あなたはいくつかのデータを受信するまで待ちたい場合は、forループを使用することはありません、

write(0, 10); 
+0

私は質問を編集しました。私の説明が悪いので、可能であれば見てください。御時間ありがとうございます。 – Mardari

+0

私の解決策は依然としてあなたの質問に当てはまると思います。次のイベントを書き込む前に、serialEvent(SerialPortEvent)がトリガされるまで再帰的に待機します。これは同期的です – Guardanis

関連する問題