Недавно я делаю проект плагина eclipse с помощью eclipse_RCP. Но я столкнулся с некоторыми проблемами с интерфейсом eclipse, когда хотел напечатать большое количество сообщений в консоли плагина.Плагин Eclipse: о функции --println (String) в org.eclipse.ui.console.MessageConsoleStream
Сообщения представляют собой сложный процесс, который можно рассматривать как фабрику, производящую сообщения все время, и никогда не останавливаться (пока клиент не остановит процесс, конечно).
Когда я печатал сообщение раньше (короткое сообщение), мне просто нужно было вызвать функцию -org.eclipse.ui.console.MessageConsoleStream.println().
но на этот раз, когда я пытался, как и раньше в первом, исполняющий-EclipseApplication (запустить режим отладки) перестал отвечать, а затем скажите мне из памяти.
Кажется, что затмение будет считывать все сообщения в памяти, а THEN печатает их на консоль один раз. Поэтому, когда количество сообщений велико, оно будет не в памяти.
Моя проблема Что делать, если я хочу напечатать сообщение по строкам в консоли?
Мое описание может быть неточным. Ниже приведен код 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 тысяч (тогда я остановить этот процесс, в противном случае он будет из памяти).
Похоже, что ecplipse хочет распечатать все из них один раз, но не линию за строкой. Так он читает и читает снова, пока не в памяти.
BTW, я нахожу записку в org.eclipse.ui.console.MessageConsoleMessage.java--
Клиенты должны избегать написания больших объемов продукции в этот поток в потоке пользовательского интерфейса. Консоли необходимо обработать вывод в потоке UI , и если клиент запустит вывод записи потока пользовательского интерфейса в консоль , консоль не сможет обработать вывод.
Это не настоящая причина, не так ли?
Я также заметил, что как cdt, так и jdt в порядке при печати большого количества сообщений. Как они это сделали?
СПАСИБО!
Какая версия Eclipse? –
Eclipse для RCP & RAP Developers, версия Eclipse Platform 3.7.1 и EPP RCP/RAP Feature 1.4.1 –