2014-12-27 2 views
10

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

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

+0

У вас есть IProgressMonitor для уведомления о запуске? monitor.done() –

ответ

1

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

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

+0

Вы правы. Я, наконец, принял этот ответ, но благодаря манути, это помогло мне найти его сам. –

2

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

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); 
+0

Спасибо за вашу помощь, но я не уверен, чтобы понять ваш ответ. Этот прослушиватель используется, чтобы узнать, когда прекратить запуск конфигурации. В моем случае я точно знаю, что делать, и моя проблема заключается в том, что в конце кода конфигурации запуска он все еще отображается. –

+0

Моя отправная точка заключалась в поиске текста «уже запущенного» в коде Eclipse (я предполагаю, что это сообщение, которое отображается всплывающей подсказкой), и это приводит меня к классу «LaunchingResourceManager», где я вижу, что текст добавлен в метод 'appendLaunched'. Чтобы проверить, есть ли уже запущенный запуск, он вызывает 'ILaunch [] launchs: DebugPlugin.getDefault(). GetLaunchManager(). GetLaunches();' и проверяет, не завершен ли какой-либо 'ILaunch'. Поэтому проблема может заключаться в том, что по-прежнему существует «ILaunch», который не завершается и не регистрируется в launchManager. – manouti

+0

Спасибо, теперь я понял. Но моя проблема в том, почему мой «запуск» не прекращается? –

Смежные вопросы