Eclipse plugin Eclipse插件:关于org.Eclipse.ui.console.MessageConsoleStream中的函数--println(字符串)
最近,我正在用eclipse\u RCP做一个eclipse插件项目。但是当我想在插件的控制台中打印大量消息时,我遇到了eclipse UI的一些问题 这些消息来自一个复杂的过程,可以认为这是一个工厂一直在生产消息,当然,直到客户机停止该过程,消息才会停止 当我在短消息之前打印消息时,我只需要调用函数-org.eclipse.ui.console.MessageConsoleStream.println 但这一次,当我像以前一样开始尝试时,运行时EclipseApplication启动调试模式停止响应,然后告诉我内存不足 eclipse似乎会读取内存中的所有消息,然后一次性将它们打印到控制台。因此,当消息数量较大时,内存将不足 我的问题是,如果我想在控制台中逐行打印消息,我该怎么办 我的描述可能不准确。下面是java代码: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启动调试模式停
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,但它似乎没有用。