Как правильно завершить выполнение запуска Eclipse?

Я пишу плагин Eclipse, внося новый тип конфигурации запуска. Он прекрасно понимает, что, когда выполнение конфигурации запуска для этого нового типа завершено, всплывающая подсказка кнопки конфигурации запуска все еще указывает, что моя конфигурация запущена.

Это вызывает проблему, когда я хочу запустить несколько таких конфигураций с использованием групп запуска, вторая конфигурация ждет бесконечно для завершения первого (я использую в группе запуска функцию wait до завершения). Поэтому я думаю, что мне не хватает чего-то, чтобы сообщить платформе, что выполнение конфигурации запуска завершено.

Ответ 1

Если я правильно помню, вам нужно запустить новую систему Process при запуске вашей конфигурации запуска (ILaunchConfigurationDelegate#launch), а затем создайте RuntimeProcess для этого Process. Затем RuntimeProcess генерирует необходимый DebugEvents и уведомляет соответствующий ILaunch, когда он был прерван.

Обычно вы создаете RuntimeProcess, вызывая DebugPlugin#newProcess(ILaunch, Process, String), но также можно создать его непосредственно (например, если вы хотите расширяем класс RuntimeProcess).

Ответ 2

Изучая конфигурацию запуска образца (в основном, предоставляемую плагином Ant), существует org.eclipse.debug.core.model.ITerminate интерфейс, который реализованные в задачах процесса/отладки, которые выполняются при запуске.

A org.eclipse.debug.core.IDebugEventSetListener зарегистрирован для обработки событий завершения, вызванных вызовом следующего оператора:

DebugPlugin.getDefault().fireDebugEventSet(
                  new DebugEvent[] {new DebugEvent(this, DebugEvent.TERMINATE)});

Пример кода из класса AntLaunchDelegate:

final boolean[] terminated = new boolean[1];
terminated[0] = launch.isTerminated();
IDebugEventSetListener listener = new IDebugEventSetListener() {
    public void handleDebugEvents(DebugEvent[] events) {
        for (int i = 0; i < events.length; i++) {
            DebugEvent event = events[i];
            for (int j = 0, numProcesses = processes.length; j < numProcesses; j++) {
                if (event.getSource() == processes[j]
                        && event.getKind() == DebugEvent.TERMINATE) {
                    terminated[0] = true;
                    break;
                }
            }
        }
    }
};
DebugPlugin.getDefault().addDebugEventListener(listener);
monitor
        .subTask(AntLaunchConfigurationMessages.AntLaunchDelegate_28);
while (!monitor.isCanceled() && !terminated[0]) {
    try {
        Thread.sleep(50);
    } catch (InterruptedException e) {
    }
}
DebugPlugin.getDefault().removeDebugEventListener(listener);