我在寫一個Eclipse插件,它提供了一個新的啓動配置類型。當完成這個新類型的啓動配置的執行完成時,它的工作原理完美,啓動配置按鈕工具提示仍然表明我的配置正在運行。如何正確結束Eclipse啓動配置執行?
這會導致問題,當我想使用啓動組啓動幾個此類配置時,第二個配置將無限期地等待第一個配置完成(我正在使用啓動組中的等待,直到終止選項)。所以我想我錯過了一些東西來告訴平臺,啓動配置的執行已經完成。
我在寫一個Eclipse插件,它提供了一個新的啓動配置類型。當完成這個新類型的啓動配置的執行完成時,它的工作原理完美,啓動配置按鈕工具提示仍然表明我的配置正在運行。如何正確結束Eclipse啓動配置執行?
這會導致問題,當我想使用啓動組啓動幾個此類配置時,第二個配置將無限期地等待第一個配置完成(我正在使用啓動組中的等待,直到終止選項)。所以我想我錯過了一些東西來告訴平臺,啓動配置的執行已經完成。
如果我沒有記錯,您需要啓動啓動配置時啓動新系統Process
(ILaunchConfigurationDelegate#launch
),然後爲此Process
創建RuntimeProcess
。然後RuntimeProcess
將生成必要的DebugEvents
並在終止時通知相應的ILaunch
。
您通常會通過調用DebugPlugin#newProcess(ILaunch, Process, String)
來創建RuntimeProcess
,但也可以直接實例化它(例如,如果您想擴展類RuntimeProcess
)。
是的,你說得對。我終於接受了這個答案,但是感謝manouti,這幫助我自己找到了答案。 –
通過查看示例啓動配置(主要是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);
感謝您的幫助,但我不確定要了解您的答案。這個監聽器用於知道何時終止啓動配置。就我而言,我確切知道該怎麼做,而且我的問題是,在我啓動配置代碼結束時,它仍然顯示正在運行。 –
我的出發點是在Eclipse代碼中搜索文本「已經運行」(我假設這是工具提示顯示的消息),並且它引導我到類「LaunchingResourceManager」,在那裏我可以看到文本是添加在'appendLaunched'方法中。爲了檢查是否已經有正在運行的啓動,它調用'ILaunch []啓動= DebugPlugin.getDefault()。getLaunchManager()。getLaunches();'並檢查是否有任何'ILaunch'沒有終止。因此,問題可能在於,仍然存在未在launchManager中終止並註冊的ILaunch。 – manouti
謝謝,我現在明白你的觀點。但我的問題是爲什麼我的「發射」沒有終止? –
你有IProgressMonitor來通知啓動完成嗎? monitor.done() –