2014-12-27 2 views
10

새로운 실행 구성 유형을 제공하는 Eclipse 플러그인을 작성 중입니다. 이 새로운 유형의 실행 구성 실행이 완료되면 실행 구성 단추 툴팁에 내 구성이 실행 중임을 나타내는 것으로 완벽하게 예상됩니다.Eclipse 실행 구성 실행을 올바르게 종료하는 방법은 무엇입니까?

시작 그룹을 사용하여 이러한 구성을 여러 개 시작하려는 경우 문제가 발생합니다. 두 번째 구성은 첫 번째 구성이 완료 될 때까지 무기한 대기합니다 (시작 그룹에서 종료까지 대기 옵션 사용). 그래서 나는 launch config의 실행이 완료되었다는 것을 플랫폼에 알리기 위해 뭔가가 빠져 있다고 생각한다.

+0

시작이 완료되었음을 알리는 IProgressMonitor가 있습니까? monitor.done() –

답변

1

을 수행해야 실행 구성이 시작될 때 (ILaunchConfigurationDelegate#launch) 새 시스템 Process을 시작한 다음이 Process에 대해 RuntimeProcess을 만듭니다. 그런 다음 RuntimeProcess은 필요한 DebugEvents을 생성하고 해당하는 ILaunch을 종료 할 때이를 알립니다.

보통 DebugPlugin#newProcess(ILaunch, Process, String)을 호출하여 RuntimeProcess을 만들지 만 직접 인스턴스화 할 수도 있습니다 (예 : RuntimeProcess 클래스를 확장하려는 경우).

+0

당신 말이 맞아. 나는이 대답을 마침내 받아 들였지만, 마누 티 덕분에, 그것은 나 자신을 찾는데 도움이되었다. –

2

샘플 실행 구성 (주로 Ant 플러그인에서 제공하는 구성)을 살펴보면 실행시 프로세스/디버그 대상에 구현 된 org.eclipse.debug.core.model.ITerminate 인터페이스가 있습니다. AntLaunchDelegate 클래스

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

샘플 코드 :

org.eclipse.debug.core.IDebugEventSetListener는 다음 문을 호출하여 트리거 종료 이벤트를 처리하도록 등록 만약 내가 올바르게 기억

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

시작점은 이클립스 코드에서 "이미 실행 중"이라는 텍스트를 검색하는 것이 었습니다 (툴팁에 표시되는 메시지라고 가정합니다). 'appendLaunched' 메소드에 추가되었습니다. 이미 실행중인 실행이 있는지 확인하기 위해'ILaunch [] launch = DebugPlugin.getDefault(). getLaunchManager(). getLaunches();를 호출하고'ILaunch '가 종료되지 않았는지 확인합니다. 그러므로 문제는 아직 종료되지 않고 launchManager에 등록 된 'ILaunch'가 있다는 것입니다. – manouti

+0

고마워, 지금 너의 요점을 알아. 하지만 내 문제는 내 "시작"이 종료되지 않은 이유입니다. –

관련 문제