JFace UI 프레임워크가 대화 상자에 타스크 진행을 표시하기 위한 기본 지원을 제공하는 것을 살펴보았습니다(자세한 내용은 장기 실행 조작 참조). 동시성 하부구조에서 동시성 및 장기 실행 조작에 대한 플랫폼 런타임 지원을 검토했습니다. 이제 플랫폼 UI가
org.eclipse.ui.progress 패키지에서 이 하부구조를 향상시키는 방법에 대해 살펴봅니다. 이 패키지는 Workbench에 작업 진행을 표시하는 UI를 제공하고 UI 스레드에서 실행하는 작업에 대한 추가 지원을 정의합니다.
첫 번째, 실행 중일 수 있는 여러 가지 종류의 배경 조작 및 이들이 Workbench UI에 표시되는 방법을 찾으십시오.
사용자 시작 작업은 사용자가 트리거한 작업입니다. Workbench는 배경에서 조작을 실행하고 작업을 계속할 수 있도록 하는 단추로 모달(modal) 진행 대화 상자에 사용자 작업을 자동으로 표시합니다. 글로벌 환경 설정이 사용자 작업이 항상 배경에서 실행될지 표시하는 데 사용됩니다. 사용자 작업은 사용 중인 작업 API에서와 같이 구별됩니다(Job#setUser). 사용자 작업의 예제에는 빌드, 프로젝트 체크아웃, 저장소와 동기화, 플러그인 내보내기 및 검색이 있습니다.
자동으로 트리거된 작업은 사용자에게 의미가 있지만 사용자에 의해 시작되지 않습니다. 이들 작업은 진행 보기 및 상태 표시줄에 표시되지만 모달 진행 대화 상자에는 작동할 때 표시되지 않습니다. 예제에는 자동 빌드 및 스케줄된 동기화가 있습니다.
시스템 조작은 사용자에 의해 트리거되지 않으며 플랫폼 구현 세부사항으로 간주될 수 있습니다. 이들 작업은 (Job#setSystem)을 사용하여 시스템 플래그를 설정하여 작성됩니다. 시스템 작업 예제에는 위지트(widget)를 채우거나 보기의 데코레이션 및 어노테이션을 계산하는 작업이 있습니다.
여러 가지 사항이 동시에 발생할 수 있는 환경을 고려하면 사용자는
다음이 필요합니다.
장기 실행 조작이 시작했다는 표시.
사용자 작업은 진행 대화 상자에서 사용자에게 표시되어 즉시 피드백을 제공하지만 자동 트리거 작업은 상태 표시줄과 진행 보기에 표시됩니다. 부분에 영향을 주는
작업은 Workbench가 사용자에게 부분에 영향을 주는 사항이 실행 중이라는 힌트를 사용자에게 제공할수 있도록 부분으로 스케줄 또는 등록되어야 합니다.
조작이 종료했다는 표시.
사용자는 진행 대화 상자가 닫히기 때문에 사용자 작업이 끝나는 시기를
쉽게 알 수 있습니다. 사용자 작업이 아닌 경우 몇 가지 피드백 메커니즘을 사용할 수
있습니다. 작업이 부분으로 스케줄 또는 등록되는
경우 부분의 진행 힌트가 완료 시기를
표시합니다. 작업이 오류를 리턴하는 경우 오류 표시기가 상태 표시줄의 오른쪽 맨 아래에 표시되어 오류가 발생했다는 힌트를 표시합니다.
대화 상자를 사용하여 새 결과나 새 정보만을 표시.
사용자 작업은 조작이 완료되면 사용자에게 결과를 직접 표시할 수 있습니다. 사용자 작업이 아닌 경우 사용자가 인터럽트되지 않도록 대화 상자 이외의 다른 것을 사용하여 결과를 표시하는 것이 좋습니다. 예를 들어 작업이 시작할 때
보기가 열리고 결과가 사용자의 작업 흐름을 방해하지 않고 이 보기에
표시될 수 있습니다. 또한 진행 보기에서 보존되어야 하며
결과를 표시할 조치를 제공함을 표시하기 위해 작업 특성을
작업에 추가할 수 있습니다. 이 경우 작업이 진행 보기에 남아있고 사용자에게
표시할 결과가 있을 때 상태 표시줄의 맨 아래 오른쪽에 경고 표시가
나타납니다.
배경 조작을 모니터하고 취소하는 기능으로 실행 중인 작업을 제어하는 일반적인 느낌.
사용자 작업은 쉽게 취소되고 진행 대화 상자의 세부사항 탭을
통해 실행 중인 블로킹 또는 동시 조작의 강력한 표시를 제공하므로
사용자에게 최상의 제어를 제공합니다. 세부사항 영역을 제공하는
향상된 진행 대화 상자는 플러그인이 IProgressService#busyCursorWhile
또는 IProgressService#runInUI를
사용할 때만 표시됨을 참고하십시오.
또한 진행 보기는 실행 중인 작업에 대한 액세스를 제공합니다.
설치된 모든 플러그인에 의한 진행의 일관된 보고.
진행 서비스 API를 사용하면 사용자가 지속적인 진행 경험을 얻게 된다는 이점이 있습니다.
Workbench 진행 서비스(IProgressService)는 Workbench 진행 지원에 대한 기본 인터페이스입니다. 이는 Workbench에서 확보하여 배경 조작과 UI 스레드에서 실행하는 조작에 대해 진행 보기를 표시하는 데 사용될 수 있습니다. 이 클래스의 기본 목적은 실행 중인 조작에 대한 원스톱 쇼핑(one-stop shopping)을 제공하여 플러그인 개발자가 해당 상황에서 진행을 표시하는 데 사용할 메커니즘을 결정할 필요가 없도록 하는 것입니다. 다른 장점은 이 메소드로 표시된 진행 대화 상자가 다른 사용자에 의해 조작이 차단되는 경우를 표시하기 위한 지원을 제공하고 충돌을 해결하는 사용자 제어를 제공하는 것입니다. 가능한 경우 IProgressService#busyCursorWhile을 사용하여 장기 실행 조작이 실행되어야 합니다.
IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); progressService.busyCursorWhile(new IRunnableWithProgress(){ public void run(IProgressMonitor monitor) { //do non-UI work } });
조작이 지정된 시간 임계값보다 오래 지속되는 경우 이 메소드가 사용 중인 커서를 진행 대화 상자로 대체합니다. 진행 대화 상자 사용에 대한 이 메소드의 장점은 조작이 짧게 실행되는 경우 진행 대화 상자가 표시되지 않는다는 점입니다. 조작이 UI를 갱신해야 하는 경우 항상 Display.asyncExec 또는 Display.syncExec를 사용하여 UI를 수정하는 코드를 실행할 수 있습니다.
조작이 UI 스레드에서 완전히 실행되어야 하는 경우 IProgressService#runInUI가 사용되어야 합니다. 이 메소드는 또한 조작이 블록되는 경우 진행 대화 상자를 표시하고 사용자 제어를 제공합니다.
progressService.runInUI( PlatformUI.getWorkbench().getProgressService(), new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { //do UI work } }, Platform.getWorkspace().getRoot());
세 번째 매개변수는 널(null)이거나 조작의 스케줄링 규칙일 수 있습니다. 이 예제에서는 이 UI 조작이 실행하는 동안 작업공간을 잠그는 작업공간 루트를 지정합니다.
또한 진행 보기가 실행 중인 작업 옆에 아이콘을 표시할 수 있도록 진행 서비스에 작업 제품군에 대한 아이콘을 등록할 수 있습니다. 다음은 자동 빌드 작업 제품군이 해당 아이콘과 연관되는 방법을 표시하는 예제입니다.
IProgressService service = PlatformUI.getWorkbench().getProgressService(); ImageDescriptor newImage = IDEInternalWorkbenchImages.getImageDescriptor( IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC); service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_MANUAL_BUILD); service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_AUTO_BUILD);
IWorkbenchSiteProgressService는 작업이 실행되는 동안 Workbench 부분의 모양을 변경하는 작업 스케줄용 API를 포함하고 있습니다. 플러그인이 부분의 상태에 영향을 주는 배경 조작을 실행 중인 경우 부분을 통해 작업을 스케줄할 수 있으며 사용자는 부분이 사용 중이라는 피드백을 받게 됩니다. 예를 들면 다음과 같습니다.
IWorkbenchSiteProgressService siteService = (IWorkbenchSiteProgressService)view.getSite().getAdapter(IWorkbenchSiteProgressService.class); siteService.schedule(job, 0 /* now */, true /* use the half-busy cursor in the part */);
Workbench가 IProgressConstants에 작업에 대한 진행 관련 특성을 정의합니다. 이들은 작업이 진행 보기에 표시되는 방법을 제어하는 데 사용할 수 있습니다. 이것은 진행 보기가 완료된 후 보기에 (IProgressConstants#KEEP_PROPERTY) 작업을 유지하거나 한번에 하나의 (IProgressConstants#KEEPONE_PROPERTY) 작업을 보기에 유지하도록 지시하는 데 사용할 수 있습니다. 조치를 (IProgressConstants#ACTION_PROPERTY) 작업과 연관시킬 수도 있습니다. 작업에 연관된 조치가 있으면 사용자가 조치를 실행할 수 있도록 진행 보기는 하이퍼링크를 표시합니다. 사용자 작업이 진행 대화 상자에 표시되는지 찾아낼 수도 있습니다(IProgressConstants#PROPERTY_IN_DIALOG). 조치가 사용 가능한 시기에 대한 힌트가 상태 표시줄 오른쪽 맨아래에 제공됩니다. 다음 예제는 이들 특성을 사용합니다.
Job job = new Job("Do Work") { public IStatus run(IProgressMonitor monitor) { // do some work. // Keep the finished job in the progress view only if it is not running in the progress dialog Boolean inDialog = (Boolean)getProperty(IProgressConstants.PROPERTY_IN_DIALOG); if(!inDialog.booleanValue()) setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); } }; job.setProperty(IProgressConstants.ICON_PROPERTY, Plugin.getImageDescriptor(WORK_IMAGE)); IAction gotoAction = new Action("Results") { public void run() { // show the results } }; job.setProperty(IProgressConstants.ACTION_PROPERTY, gotoAction); job.setUser(true); job.schedule();
가능한 경우 UI 스레드 외부에서 장기 실행 오퍼레이션을 수행해야 합니다. 그러나 오퍼레이션의 목적이 UI를 갱신하는 것일 경우 UI 스레드에서 수행되어야 합니다. SWT 스레딩 문제에서는 SWT Display를 사용하여 완료할 수 있는 방법에 대해 설명합니다. Workbench에서는 실행 메소드가 SWT asyncExec에서 실행되는 특수 작업 UIJob에 대해 정의합니다. UIJob의 서브클래스는 run 메소드 대신 runInUIThread 메소드를 구현해야 합니다.
WorkbenchJob은 Workbench가 실행될 때만 작업을 스케줄하거나 실행하도록 UIJob을 확장합니다. UI 작업의 지속기간 동안 UI가 새로 고쳐지지 않으므로 항상 UI 스레드에서 과도한 작업을 피해야 합니다.