2014-01-22 3 views
0

Eclipse 작업 API를 처음으로 사용하고 있습니다. 큰 데이터를 처리하기 위해 jar 파일에서 메서드를 호출해야하는 플러그인이 있으므로 진행 대화 상자를 표시해야합니다. 내 질문은 처리 된 데이터 항목 수를 사용하여 진행률 대화 상자를 어떻게 업데이트 할 수 있습니까? 지금은Eclipse 작업에서 실행중인 태스크의 카운터를 사용하여 진행 대화 상자를 업데이트하는 방법 API

Job job = new Job("Annotate"){ 
        protected IStatus run(IProgressMonitor monitor){ 
         monitor.beginTask("Annotation..", annotate.getTotal()); 
         annotate.annotateData(); 
         monitor.done(); 

          Display.getDefault().asyncExec(new Runnable() { 
           public void run() { 
            try { 
             SaveUtils.saveEntry(wizard.getEntry(), AnnotationEntry); 
            } catch (IOException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
            } 
           } 
          }); 

         return Status.OK_STATUS; 
        } 

       }; 
       job.setUser(true); 
       job.schedule(); 

주석 객체가 처리 한 데이터 항목의 수를 반환하는 방법을이이 코드를 가지고,하지만 난 주석 객체에 진행 대화 이야기를 할 방법을 모르겠어요. 생각이나 예를 들어 도와주세요.

+1

당신이 annotate.annotateData()''실행되는 동안 진행 상황을 업데이트 할 의미합니까? –

+0

예 싶습니다. – thinkBig

답변

0

이 까다로운 문제에 대한 해결책을 찾았습니다. 다음 단계는 다음과 같습니다 나는 방법 무효 setCurrentIndex와 IControlProgressDialog()가 호출 내 주석 패키지 내부 인터페이스를 생성

  1. ;

  2. annotateData 메서드에서 IControlProgressDialog 유형의 매개 변수를 추가했습니다.

  3. 내 데이터 항목을 반복하는 루프 안에 setCurrentIndex();

  4. 인터페이스를 구현하는 ImplControlProgressDialog라는 클래스를 만들어서 IProgressMonitor 유형의 개체 참조를 정의합니다. ImplControlProgressDialog에

  5. 제가

    setCurrentIndex 공극을() {메소드 setCurrentIndex()를 구현 monitor.worked (1); 은}

이 나에게 annotate.annotateData()가 다른 스레드에서 실행되는 동안 진행 대화 상자를 업데이트 할 수있는 능력을 주었다.

내 작업의 업데이트 된 코드 :

Job job = new Job("Annotate"){ 
       protected IStatus run(IProgressMonitor monitor){ 
        monitor.beginTask("Annotation..", annotate.getTotal()); 
        ImplControlProgressDialog control = new ImplControlProgressDialog (monitor); 
        annotate.annotateData(control); 
        monitor.done(); 

         Display.getDefault().asyncExec(new Runnable() { 
          public void run() { 
           try { 
            SaveUtils.saveEntry(wizard.getEntry(), AnnotationEntry); 
           } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
          } 
         }); 

        return Status.OK_STATUS; 
       } 

      }; 
      job.setUser(true); 
      job.schedule(); 
0

annotate.getTotal()에 필요한 작업량과 일치하는 매개 변수의 합계로 monitor.worked()를 충분하게 호출합니다. 위와 같이 UI 스레드에서 작업하는 경우 UI 스레드가 필요한 업데이트가 원활하게 표시되지 않습니다.

+0

새 스레드를 생성하기 위해 작업 객체 내에서 작업하고 있습니다. 따라서 UI 스레드를 사용하지 않습니다. 진행 문제 대화 상자를 annotate.annotation()과 동기화하는 방법이 문제이므로 mintor.worked()를 사용하여 문제가 해결되지 않습니다. – thinkBig

+0

Display.getDefault(). asyncExec()는 UI 스레드에서 해당 Runnable을 실행합니다. annotate.annotation()에 대한 호출이 없습니다. – nitind

0

장기 실행 방법으로 진행 상황을 알 수없는 경우 별도의 스레드에서 메서드를 실행하고 스레드가 종료 될 때 Job이 진행률 모니터를 정기적으로 업데이트하고 스레드가 종료 될 때 중단하는 것이 좋습니다. .