장기 실행 중인 작업(2초 이상의 지속적인 작업)은 작업의 run 메소드에 전달되는 IProgressMonitor에 진행 상태를 보고해야 합니다. Workbench 진행 보기는 지정된 완료 작업 단위 및 모든 진행 메시지를 이 모니터에 표시합니다.
또한 제공된 진행 모니터는 진행 보기에서 작성된 취소 요청이 있는지를 확인하는 데에도 사용됩니다. 사용자(또는 작업 API를 사용하는 플러그인)가 작업을 취소하려고 시도할 때 IProgressMonitor 메소드 isCanceled()는 true를 리턴합니다. 작업은 작업의 취소 상태를 수시로 확인하고 취소를 발견하면 즉시 run 메소드를 종료하여 취소에 응답해야 합니다. 다음 run 메소드는 진행 상태를 보고하고 작업 취소에 응답합니다.
public IStatus run(IProgressMonitor monitor) { final int ticks = 6000;monitor.beginTask("Doing some work", ticks); try { for (int i = 0; i < ticks; i++) {if (monitor.isCanceled())return Status.CANCEL_STATUS;monitor.subTask("Processing tick #" + i);//... do some work ...monitor.worked(1); } } finally { monitor.done(); } return Status.OK_STATUS;
}
beginTask 메소드는 해당 진행 보기의 타스크 이름을 지정하고 보기가 진행 상태를 계산할 수 있도록 수행할 총 작업량을 설정하는 데 사용됩니다. subTask 메시지는 작업이 수행되면 진행 트리에서 하위로 표시됩니다. 진행 보기는 작업이 완료된 호출에서 보고하는 작업량을 기초로 완료율을 계산하여 표시합니다.
보는 바와 같이 IProgressMonitor
클래스는 해당 UI 지원을 고려하여 설계됩니다. 플랫폼의
UI 플러그인은 Workbench가 실행 중인
작업의 진행 상태를 표시할 수 있도록 지원을 제공합니다. 작업을 표시하는
방법을 제어할 수 있도록 이 사항을 고려하여 작업을
설정할 수 있습니다.
작업의 진행 상태를 표시하는 데 사용할 수 있는 API를 자세히 살펴 보려면
Workbench 동시성 지원을
참조하십시오.
작업이 사용자에게 표시하지 않으려는 하위 레벨 구현 세부사항일 경우에는 어떻게 하시겠습니까? 작업을 시스템 작업으로 플래그할 수 있습니다. 시스템 작업은 해당 UI 지원이 진행 보기를 설정하지 않거나 작업 실행과 연관된 다른 모든 UI 제공성을 표시하는 것을 제외하고는 다른 모든 작업과 같습니다. 작업이 사용자 직접 또는 사용자가 구성할 수 있는 주기적인 타스크에 의해 시작되지 않을 경우 작업은 시스템 작업입니다. 시스템 작업을 설정하는 프로토콜은 다음과 같이 단순합니다.
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
setSystem 호출은 작업이 스케줄되기 전에 수행되어야 합니다. 현재 대기 중이거나 일시 정지 중 또는 실행 중인 작업에서 이 호출을 시도할 경우 예외가 트리거됩니다.
작업이 사용자가 시작하는 장기 실행 중인 조작일 경우 작업을 사용자 작업으로 플래그해야 합니다. 사용자 작업은 대화 상자를 배경으로 이동시키는 단추를 제공하는 모달(modal) 진행 대화 상자에 표시됩니다. Workbench는 이러한 대화 상자가 모델 여부를 제어하는 사용자 환경 설정을 정의합니다. 작업을 사용자 작업으로 정의하면 진행 피드백은 진행 보기의 사용자 환경 설정을 자동으로 준수합니다. 사용자 작업을 설정하는 프로토콜은 다음과 유사합니다.
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
또한 setUser 호출은 작업이 스케줄되기 전에 수행되어야 합니다.
진행 그룹은 작업이 UI에 표시되는 방식에 영향을 주는 데 사용될 수 있는 또 다른 메커니즘입니다. UI에 여러 관련 작업에 대한 총 진행 상태를 표시하는 것이 더 적절할 경우 관련 작업 그룹을 표시하는 특수 IProgressMonitor를 작성할 수 있습니다. 이 모니터는 IJobManager 프로토콜을 사용하여 작성됩니다. 다음 스니펫은 진행 그룹을 작성하고 이 그룹을 작업과 연관시키는 방법을 보여 줍니다.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup();job.setProgressGroup(myGroup, 600); // specify the units of work the job needs to show.job.schedule() ...
그룹 기능을 사용하면 필요에 따라 플러그인이 타스크를 다중 작업으로 구분할 수 있지만 타스크가 단일 타스크인 것처럼 사용자에게 보고할 수 있습니다. 진행 그룹 모니터는 그룹의 모든 작업과 관련된 완료율을 계산하는 세부사항을 처리합니다.
작업은 스케줄되기 전에 진행 그룹에 배치되어야 합니다. 작업이 실행을 완료한 후에는 진행 그룹에 대한 참조가 손실됩니다. 작업이 재스케줄될 경우 스케줄되기 전에 다시 한번 그룹에 설정해야 합니다.