2

COM ポートを使用しています。COM ポートを正常に開き、すべての作業を行います。COM ポートを閉じると、クラッシュが発生します。コードは

public void close()
    throws GPSException
  {
    if (serial_port_ != null)
      serial_port_.close();
  }

エラー

#
> # An unexpected error has been detected by Java Runtime Environment:
> #
> #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x04049e69, pid=5692,
> tid=4100
> #
> # Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing
> windows-x86)
> # Problematic frame:
> # C  [rxtxSerial.dll+0x9e69]
> #
> # If you would like to submit a bug report, please visit:
> #   http://java.sun.com/webapps/bugreport/crash.jsp
> # The crash happened outside the Java Virtual Machine in native code.
> # See problematic frame for where to report the bug.
4

2 に答える 2

1

私は問題を解決するように見える解決策を見つけることができました-これらは独自のスレッドで実行されており、独自のスレッドに巻き込まれているため、シリアルポートが閉じられる前に入力ストリームと出力ストリームが完全に閉じられていないようですデータ。これは、シリアルポートが閉じられる前にこれらのスレッドが適切にクリーンアップされるようにする同期ミューテックスを追加することで解決されます。

SerialConnectionクラスに、ブールフィールドstopReadとstopWriteを追加して、InputStreamスレッドとOutputStreamスレッドがそれぞれリッスンを停止するタイミングを示しました。また、ミューテックスstopReadMutexとstopWriteMutexを追加して、メインスレッドと読み取り/書き込みスレッド間でこれらの値を同期しました。ループが繰り返されるたびに、リーダーとライターはstopReadブール値とstopWriteブール値をチェックし、ループを解除します。

次に示すように、切断関数が呼び出されると、ミューテックスを使用してstopRead値とstopWrite値を変更してから、それぞれのスレッドとserialPortのclose関数を呼び出します。

public void disconnect(){
    try {
        synchronized(stopReadMutex)
        {stopRead = true;}
        synchronized(stopWriteMutex)
        {stopWrite = true;}

        portOut.close();
        portIn.close();
        serialPort.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

また、誰かが詳しく調べたい場合は、関連するソースコードへのリンクがあります。 http://pastebin.com/C4Fy8mLZ

于 2012-05-31T00:20:44.513 に答える
0

このエラーは、競合するスレッドが原因です。これを回避する最善の方法は、すべてのメソッドを作成することsynchronizedです。

public synchronized void disconnect() {
  serialPort.close();
}
于 2012-10-19T10:04:21.733 に答える