2014-12-27 18 views
10

我在写一个Eclipse插件,它提供了一个新的启动配置类型。当完成这个新类型的启动配置的执行完成时,它的工作原理完美,启动配置按钮工具提示仍然表明我的配置正在运行。如何正确结束Eclipse启动配置执行?

这会导致问题,当我想使用启动组启动几个此类配置时,第二个配置将无限期地等待第一个配置完成(我正在使用启动组中的等待,直到终止选项)。所以我想我错过了一些东西来告诉平台,启动配置的执行已经完成。

+0

你有IProgressMonitor来通知启动完成吗? monitor.done() –

回答

1

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

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

+0

是的,你说得对。我终于接受了这个答案,但是感谢manouti,这帮助我自己找到了答案。 –

2

通过查看示例启动配置(主要是Ant插件提供的配置),有一个org.eclipse.debug.core.model.ITerminate接口在启动时执行的过程/调试目标中实现。

一个org.eclipse.debug.core.IDebugEventSetListener被注册为处理这些通过调用下面的语句触发终止事件:从AntLaunchDelegate

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

示例代码:

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 []启动= DebugPlugin.getDefault()。getLaunchManager()。getLaunches();'并检查是否有任何'ILaunch'没有终止。因此,问题可能在于,仍然存在未在launchManager中终止并注册的ILaunch。 – manouti

+0

谢谢,我现在明白你的观点。但我的问题是为什么我的“发射”没有终止? –