如何正确结束Eclipse启动配置执行?

时间:2014-12-27 08:16:34

标签: java eclipse eclipse-plugin

我正在编写一个Eclipse插件,它提供了一个新的启动配置类型。完全可以预期,当完成此新类型的启动配置的执行时,启动配置按钮工具提示仍指示我的配置正在运行。

当我想使用启动组启动多个此类配置时,这会导致问题,第二个配置无限期地等待第一个配置完成(我使用启动组的等待直到终止选项)。所以我想我错过了告诉平台启动配置执行完成的事情。

2 个答案:

答案 0 :(得分:3)

如果我没记错的话,您需要在启动启动配置(Process)时启动新系统ILaunchConfigurationDelegate#launch,然后为此Process创建RuntimeProcess。然后,RuntimeProcess会生成必要的DebugEvents,并在终止时通知相应的ILaunch

您通常会通过调用DebugPlugin#newProcess(ILaunch, Process, String)来创建RuntimeProcess,但也可以直接对其进行实例化(例如,如果您想扩展类RuntimeProcess)。

答案 1 :(得分: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);