2012-03-15 2 views
0

Недавно я делаю проект плагина 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 в порядке при печати большого количества сообщений. Как они это сделали?

СПАСИБО!

+0

Какая версия Eclipse? –

+0

Eclipse для RCP & RAP Developers, версия Eclipse Platform 3.7.1 и EPP RCP/RAP Feature 1.4.1 –

ответ

0

Вы должны использовать метод flush() каждый так часто писать MessageConsoleStream на консоль.

Метод flush() является частью класса IOConsoleOutputStream, в пакете org.eclipse.ui.console.Метод flush() не задокументирован, поэтому я вижу, как вы могли его пропустить.

+0

Но даже я использую метод flush() каждый раз, когда я вызываю метод println (String str), затмение перестает отвечать или. –

+0

Спасибо за ваш ответ :) Я попытался создать MessageConsoleStream, но это кажется бесполезным. –