シリアルポートに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();
}
}
しかし、それが正しい解決策であるかどうかはわかりません。ありがとう。
通常:
だから、あなたの例から、あなたがそれを使用することができます。むしろ、通知の際にリスナーであなたの書き込み呼び出しを行います。 – ControlAltDel
forループで、時間当たり128バイトを書き込むシリアルポートにフラッシュISOイメージを書き込む必要があります。各書き込みの後、リスナーはすべてが正常であることを確認し、これは別の128バイトを送信するフラグです。だから私はforループでこれが必要です。 – Mardari
128バイトが得られるまで読んでから、そのチャンクを書きます。それはなぜ問題なのですか? – ControlAltDel