Плагин Eclipse: о функции --println (String) в org.eclipse.ui.console.MessageConsoleStream - PullRequest
0 голосов
/ 15 марта 2012

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

СПАСИБО!

1 Ответ

0 голосов
/ 15 марта 2012

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

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

...