2014-12-27 20 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

謝謝,我現在明白你的觀點。但我的問題是爲什麼我的「發射」沒有終止? –