Eclipse plugin - задержка записи в консоль - PullRequest
2 голосов
/ 09 января 2012

Я разрабатываю плагин Eclipse, который читает и пишет в консоль.Я ожидаю, что следующий код высветит окно предупреждения с надписью «Hello World».

public void run(IAction action) {
        ConsoleCommands.writeToConsole("Hello World!");
        Alert(ConsoleCommands.readConsole());
    }

Однако предупреждение просто отображается пустым.Некоторое расследование показало, что чтение происходило до записи (дисплей на консоли был в порядке, только предупреждение показывало предыдущее состояние консоли), поэтому я попытался,

public void run(IAction action) {
        ConsoleCommands.writeToConsole("Hello Wolrd!");
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Alert(ConsoleCommands.readConsole());
    }

на случай, еслипроблема с многопоточностью, но это просто задерживает запись на консоль.Есть идеи, что происходит?

---- РЕДАКТИРОВАТЬ -----

Если это полезно, вот код для методов ...

import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;


public class ConsoleCommands {

    private static MessageConsole findConsole(String name) {
        ConsolePlugin plugin = ConsolePlugin.getDefault();
        IConsoleManager conMan = plugin.getConsoleManager();
        IConsole[] existing = conMan.getConsoles();
        for (int i = 0; i < existing.length; i++)
            if (name.equals(existing[i].getName()))
                return (MessageConsole) existing[i];
        // no console found, so create a new one
        MessageConsole myConsole = new MessageConsole(name, null);
        conMan.addConsoles(new IConsole[] { myConsole });
        return myConsole;
    }

    public static String readConsole() {
        MessageConsole myConsole = findConsole("Joe's Console");
        IDocument doc = myConsole.getDocument();
        return doc.get();
    }

    public static MessageConsole writeToConsole(String output) {
        MessageConsole myConsole = findConsole("Joe's Console");
        MessageConsoleStream out = myConsole.newMessageStream();
        out.println(output);
        return myConsole;
    }

}

1 Ответ

1 голос
/ 26 июля 2012

Попробуйте записать в консоль, используя myConsole.getDocument().set(output) вместо потока.

Я не знаю, является ли это рекомендуемой практикой, но она решила проблему для нас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...