0

最近、eclipse_RCP を使用して Eclipse プラグイン プロジェクトを行っています。しかし、プラグインのコンソールに多数のメッセージを出力したいときに、Eclipse UI でいくつかの問題が発生しました。

メッセージは、常にメッセージを生成するファクトリと見なすことができる複雑なプロセスからのものであり、停止することはありません (もちろん、クライアントがプロセスを停止するまで)。

以前にメッセージを出力したとき (メッセージは短い)、関数 -org.eclipse.ui.console.MessageConsoleStream.println() を呼び出すだけで済みました。

しかし、今回は、最初に前のように試してみると、runtime-EclipseApplication (デバッグモードを起動) が応答を停止し、メモリが不足していることを教えてくれまし た。

日食はメモリ内のすべてのメッセージを読み取り、一度コンソールに出力するようです。そのため、メッセージの数が多いと、メモリが不足します。

私の問題は、コンソールにメッセージを 1 行ずつ出力したい場合、どうすればよいですか?

私の説明は正確ではないかもしれません。以下はJavaコードです:

    public  void print(Process p) {     
    BufferedReader in = new BufferedReader(
            new InputStreamReader(p.getInputStream()),1024);
    String line = "";

    try {   
        while ((line = in.readLine()) != null) {
                //it is correct when print in the main console
                System.out.println(line);   
                //when print in plugin console .it is out of memory
                //this is the function
               //org.eclipse.ui.console.MessageConsoleStream.println()
                 println(line);

        }
        in.close();
        this.flush();
        this.close();
        p.destroy();
    } 
    catch (IOException e) {     
        e.printStackTrace();
    }
}

次に、最初にファイルに書き込もうとし、MessageConsoleStream に 1000 メッセージごとにファイルから読み取らせますが、同じように見えます。

        public  void print(Process p) {     

    BufferedReader in = new BufferedReader(
            new InputStreamReader(p.getInputStream()),1024);
    String line = "";
    char []tem = new char[1024];
    int i = 0  ;
    try {   
        File temp = File.createTempFile("temp", ".tep",new File("E:/"));
        FileWriter out = new FileWriter(temp);
        MessageConsoleStream mcs = null;
        while((line = in.readLine())!=null){

            if(i<=1000){
                System.out.println(line);
                out.write(line+"\n", 0, line.length()+1);
                i++;
            }
            else{
                i=0 ;
                out.flush();
                out.close();
                FileReader fr=new FileReader(temp);
                mcs = CConsole.getMessageStream("consoleName", "file name");
                while( fr.read(tem, 0, 1024)!=-1){
                    mcs.print(String.valueOf(tem));
                    }
                mcs.flush();
                mcs.close();
                fr.close();
                out = new FileWriter(temp,false);                   
                }   
        }
        if(i!= 0){
            mcs = CConsole.getMessageStream("consoleName", "file name");
            out.flush();
            out.close();
            FileReader fr=new FileReader(temp);
            while( fr.read(tem, 0, 1024)!=-1){
                mcs.print(String.valueOf(tem));
                }
          mcs.flush();
            mcs.close();
        }
        in.close();
        p.destroy();
    } 
    catch (IOException e) {     
        e.printStackTrace();
    }
}

メッセージの数が 600,000 を超えると、上記のすべての方法で日食がメモリ不足になります (その後、プロセスを停止します。そうしないと、メモリ不足になります)。

日食はそれらすべてを一度に印刷したいが、行ごとに印刷したくないようです。そのため、メモリがなくなるまで読み取りと読み取りを繰り返します。

ところで、org.eclipse.ui.console.MessageConsoleMessage.java にメモがあります—</p>

クライアントは、UI スレッドでこのストリームに大量の出力を書き込まないようにする必要があります。コンソールは UI スレッドで出力を処理する必要があり、クライアントがコンソールに出力を書き込む UI スレッドを独占すると、コンソールは出力を処理できなくなります。

それは本当の理由ではありませんね。

また、多数のメッセージを出力する場合、cdt と jdt の両方が正常であることにも気付きました。

ありがとう!</p>

4

1 に答える 1

0

コンソールに出力するには、このflush()メソッドを頻繁に使用する必要があります。MessageConsoleStream

flush()メソッドは、パッケージIOConsoleOutputStream内のクラスの一部です。org.eclipse.ui.consoleこのflush()方法は十分に文書化されていないため、見逃している可能性があることがわかります。

于 2012-03-15T14:27:26.537 に答える