commPortのclose処理で苦労した
Pic-coloは、COMMポートがオープンできない場合はPICとの通信は行わず、SettingメニューでCOMMポートの指定が修正されて、ポートがオープンできた場合にPICとの通信を始めます。
ここまでは、良いのですが問題はCOMMポートが複数ある場合です。一方のCOMMポートを開いた後に、SettingメニューでCOMMポートの指定が変更された場合、現在開いているCOMMポートをクローズしてから、新しく指定されたCOMMポートをオープンすることになります。ところが・・・何故かclose関数から戻ってこないのです。orz
ネット上にもrxtxのclose処理で困っている方が大勢いるようです。
”こうすると良い”という記事を見つけたのですが・・・
> serialPort.removeEventListener();
> serialPort.close();
https://marc.info/?l=rxtx&m=123544269723586&w=2
駄目でした。
諦め半分で、暫くジタバタして・・・
ん!出来た?
ReceiveThreadとSendThreadの停止を待ち、portのInputStreamとOutputStreamをcloseしてからportをcloseしたら、上手く行きました!
(パチパチパチ~)
コードはこんな感じです。
-------------------------------
private class CloseThread implements Runnable {
public void run() {
try {
thread_break = true; <== ReceiveThread、SendThreadの順に停止させる
while( !st_break ) <== SendThreadの停止を待つ
{
try {
sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
}
}
out.close();
in.close();
port.close();
} catch (IOException ex) {
Logger.getLogger(Comm.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
close処理をThread化したのは、close処理を始めた後もメイン・ループからステータス受信のコマンドを出させるためです。それによって、ReceiveThreadとSendThreadが走り、whileループから抜けます。
やれやれ。