0

最近我正在用 eclipse_RCP 做一个 eclipse 插件项目。但是当我想在插件的控制台中打印大量消息时,我遇到了 eclipse UI 的一些问题。

这些消息来自一个复杂的过程,可以被认为是一个一直在生产消息并且永不停止的工厂(当然,直到客户端停止该过程)。

之前打印消息的时候(消息很短),只需要调用函数-org.eclipse.ui.console.MessageConsoleStream.println()。

但是这一次,当我像以前一样尝试时,运行时 EclipseApplication(启动调试模式) 停止响应,然后告诉我 内存不足

似乎eclipse会读取内存中的所有消息,然后将它们打印到控制台一次。所以当消息数量很大时,它会内存不足。

我的问题是如果我想在控制台中逐行打印消息该怎么办?

我的描述可能不准确。下面是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时,上述所有方法都会使eclipse内存不足(然后我停止该进程,否则会内存不足)。

看起来 ecplipse 想要一次打印所有这些,但不是逐行打印。所以它会读取并再次读取,直到内存不足。

BTW,我在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 回答