denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

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ループから抜けます。

やれやれ。