Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse plugin Eclipse插件:关于org.Eclipse.ui.console.MessageConsoleStream中的函数--println(字符串)_Eclipse Plugin_Console_Println_Large Data - Fatal编程技术网

Eclipse plugin Eclipse插件:关于org.Eclipse.ui.console.MessageConsoleStream中的函数--println(字符串)

Eclipse plugin Eclipse插件:关于org.Eclipse.ui.console.MessageConsoleStream中的函数--println(字符串),eclipse-plugin,console,println,large-data,Eclipse Plugin,Console,Println,Large Data,最近,我正在用eclipse\u RCP做一个eclipse插件项目。但是当我想在插件的控制台中打印大量消息时,我遇到了eclipse UI的一些问题 这些消息来自一个复杂的过程,可以认为这是一个工厂一直在生产消息,当然,直到客户机停止该过程,消息才会停止 当我在短消息之前打印消息时,我只需要调用函数-org.eclipse.ui.console.MessageConsoleStream.println 但这一次,当我像以前一样开始尝试时,运行时EclipseApplication启动调试模式停

最近,我正在用eclipse\u 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();
    }
}
以上所有方法都会使eclipse内存不足,当消息数超过600000时,我会停止进程,否则会内存不足

看起来ecplipse想要一次打印所有内容,但不是一行一行地打印,所以它会一次又一次地读取,直到内存耗尽

顺便说一句,我在org.eclipse.ui.console.MessageConsoleMessage.java中找到了一个注释--

客户端应避免将大量输出写入此流 在UI线程中。控制台需要在UI中处理输出 线程,如果客户端占用UI线程,则将输出写入 控制台,控制台将无法处理输出

这不是真正的原因,不是吗

我还注意到,当打印大量消息时,cdt和jdt都是正常的。它们是如何工作的

谢谢!

您必须经常使用flush方法将消息consoleStream写入控制台


flush方法是org.eclipse.ui.console包中IOConsoleOutputStream类的一部分。flush方法没有很好的文档记录,所以我可以看出您可能错过了它。

Eclipse对于RCP和RAP开发人员来说,版本是Eclipse平台3.7.1和EPP RCP/RAP功能1.4.1,但即使我每次调用printlString str方法时都使用flush方法,eclipse也停止响应。谢谢你的回复:我已经尝试创建一个新的MessageConsoleStream,但它似乎没有用。