Как мне управлять выводом консоли в долго работающий плагин Eclipse? - PullRequest
0 голосов
/ 31 января 2012

Я написал плагин Eclipse, который работает.Что происходит, однако, это то, что во время выполнения не выводится консольный вывод.Только когда процесс завершен, вывод отображается в консоли.Ниже приведен мой обработчик, который отображается как точка расширения типа org.eclipse.ui.commands:

public class MyHandler extends AbstractHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        ...
        MessageConsoleStream out = myConsole.newMessageStream();
        ...
        IConsoleView view = (IConsoleView) page.showView(id);
        view.display(myConsole);
        ...

        out.println("output that only shows up at the end");
        myConsole.activate();
        ...
        // Slow process
        ...
        out.println("everything is done");
        return null;
    }
}

Так что пока процесс выполняется, в консоли ничего нет.Затем, в конце, отображаются обе выходные строки.

Я, очевидно, неправильно делаю консоль, но я не нашел хороших примеров и мои эксперименты не оказались очень плодотворными.Пожалуйста, сообщите.

Ответы [ 3 ]

0 голосов
/ 31 января 2012

Это сработало:

public class Merge extends AbstractHandler {
private static MessageConsole myConsole = null;
private static ExecutionEvent event = null;

@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
    Merge.event = event;

    //same idea as original post and other examples where it makes new or finds existing
    myConsole = makeConsole(Merge.event); 

    Job job = new Job("My Job Name"){
        @Override
        protected IStatus run(IProgressMonitor monitor){
            ...
            if (blah) {
                MessageConsoleStream out = myConsole.newMessageStream();
                out.println("output show up right away");
                ...
                // Slow process
                ...
                out.println("everything is done");
            } else {
                MessageDialog.openInformation(HandlerUtil.getActiveShell(Merge.event), "Information", "Please select valid file");
            }
            monitor.done();
            return Status.OK_STATUS;
        }
    };
    job.setUser(true);
    job.schedule();
    return null;
}
...
}
0 голосов
/ 31 января 2012

Может быть, вы можете вызывать out.flush () после каждого out.print ...

0 голосов
/ 31 января 2012

Вы можете рассмотреть возможность использования ProgressMonitor (возможно, с отменой в случае, если пользователь хочет прервать), чтобы пользователь мог видеть, что что-то происходит.

...