0

コンテキスト: 115.2 Kbaud でシリアル ポートからデータを読み取っています。読み取ったデータは、JTextArea に追加する PrintWriter を使用して印刷されます。

すべて正常に動作しますが、シリアル ポートから PrintWriter にストリームを送信するメソッドが終了するまで、JTextArea 内のテキストは表示されません。一度に 20 ~ 30 MB 以上のテキストを受信することがあり、プログラムの実行に伴ってテキストの一般的な流れがどのように変化するかが重要になるため、よりリアルタイムに近い表示をしたいと考えています。

ここでは PrintWriter to JTextArea メソッドを使用してい ます。解決策はおそらく Threads と PipedWriter/PipedReader に関係していると思いますが、それを実装するために行ったすべての試みは惨めに失敗しました。

ご協力ありがとうございました。

//code calling method;  VerifierReader does not inherit from Reader 
//or any such class. it's wholly homegrown. I send it the PrintWriter 
//as out, telling it to output there


verifierInstance=new VerifierReader("COM3", verifierOutputLocString.getText());
verifierInstance.setSysOutWriter(out);
verifierInstance.readVerifierStream();

// and the relevant code from VerifierReader

public void setSysOutWriter (PrintWriter outWriter) {
        sysOutWriter=new PrintWriter(outWriter);            

    }
public void readVerifierStream() throws SerialPortException, 
InterruptedException{

    try{
        sysOutWriter.println("Listening for verifier...");
                    //sysOutWriter.flush();

        verifierPort.addEventListener(new verifierListener());

        lastReadTimer=System.currentTimeMillis();

        while(verifierPort.isOpened()) {

            Thread.sleep(1000);
            //System.out.println(timeOut);
            if( ((long)(System.currentTimeMillis()-lastReadTimer))>timeOut){
                sysOutWriter.println("Finished");
                verifierPort.removeEventListener();
                verifierPort.closePort();

            }
        }
    }

    finally {

        if (verifierPort.isOpened()) {
            verifierPort.closePort();
        }

        bfrFile.close();

    }
}








private class verifierListener implements SerialPortEventListener{

    String outBuffer;




    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR()){//If data is available
            timeOut=200;
            lastReadTimer=System.currentTimeMillis();
            if(event.getEventValue() > 0){//Check bytes count in the input buffer

                try {
                    byte[] buffer = verifierPort.readBytes(event.getEventValue());
                    outBuffer=new String(buffer);

                    bfrFile.print(outBuffer);
                    sysOutWriter.print(outBuffer);
                        //bfrFile.flush();
                        //sysOutWriter.flush();
                }
                catch (SerialPortException ex) {
                    sysOutWriter.println(ex);
                }

            }
        }



    }
}

編集:

以下で推奨されていることを試し、次の変更を加えました。

 private class VerifierTask extends SwingWorker<Void, String> {



    public VerifierTask() throws IOException, SerialPortException, InterruptedException{
        verifierInstance= new VerifierReader(streamReader);
        verifierInstance.setReaderIO("COM3", verifierOutputLocString.getText());
        verifierInstance.readVerifierStream();

    }


    @Override
    protected Void doInBackground() throws IOException{
        int charItem;
        char[] charBuff = new char[10];
        String passString;

        while ((charItem = streamReader.read(charBuff, 0, 10)) !=-1) {

            passString = new String(charBuff);
            publish(passString);
        }


        return null;
    }

    @Override 
    protected void process(List<String> outList) {

        for (String output : outList) {
            outputArea.append(output);
        }

    }



}

が追加され、ボタンを変更して、VerifierTask クラスの新しいインスタンスをすぐに呼び出すようにしました。さらに、VerifierReader に出力用の PipedWriter を実装させました (すべてが文字列です)。

ここで何が間違っているのかわかりません。このコードが実行されると、Java プロセスは無期限にフリーズします。

VerifierTask スレッドで作成された VerifierReader がそのスレッドに関連付けられていると正しく想定しているので、thread.sleep および while(true) ステートメントは問題を引き起こさなくなりましたか?

4

1 に答える 1

2

メインのSwingイベントスレッドであるEDTでThread.sleepを呼び出したり、while(true)を呼び出したりしないでください。これまで。代わりに、SwingWorkerを介して提供されるようなバックグラウンドスレッドでこの種のことを行います。公開/処理メソッドのペアを使用して、JTextAreaへの中間結果を取得します。

詳細については、チュートリアル「Swingでの同時実行」を確認してください。

于 2011-11-18T18:58:27.833 に答える