Недавно я делаю проект плагина eclipse с eclipse_RCP.Но я столкнулся с некоторыми проблемами с пользовательским интерфейсом eclipse, когда хотел напечатать большое количество сообщений в консоли плагина.
Сообщения происходят из сложного процесса, который можно рассматривать как фабрику, производящую сообщения все время иникогда не останавливаться (пока клиент, конечно, не остановит процесс).
Когда я печатал сообщение раньше (сообщение короткое), мне просто нужно было вызвать функцию -org.eclipse.ui.console.MessageConsoleStream.println ().
НО на этот раз, когда я пытался, как раньше, runtime-EclipseApplication (запустить режим отладки) перестал отвечать , а затем сказать мне Недостаточно памяти .
Похоже, что затмение прочитает все сообщения в памяти и ТОГДА выведет их на консоль один раз. Так что, когда количество сообщений велико, ононе хватает памяти.
Моя проблема Что мне делать, если я хочу печатать сообщение построчно в консоли?
Мои описанияможет быть не точным.Ниже приведен код 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——
Клиенты должны избегать записи больших объемов вывода в этот поток в потоке пользовательского интерфейса.Консоль должна обработать вывод в потоке пользовательского интерфейса, и если клиент включит вывод потока пользовательского интерфейса в консоль, консоль не сможет обработать вывод.
Это не реальнопричина, не правда ли?
Я также замечаю, что cdt и jdt в порядке при печати большого количества сообщений. Как они это сделали?
СПАСИБО!