2013-12-17 5 views
-1

일식 RCP 응용 프로그램을 작성 중입니다. 나는 약 800자를 가지고있는 ScalableLayeredPane을 가지고있다.작업을 사용하여 확대/축소 작업을 취소 할 수 없습니다.

setScale() 방법을 사용하여 줌 값을 변경해야합니다.

또한 Job을 사용하여 확대 진행 상황을 표시하려고합니다.

asyncexec 메서드를 사용하여 setScale() 함수를 호출합니다. 그러나 내 GUI가 굶주리고 있으며 취소 버튼도 클릭 할 수 없습니다.

이 문제에 대한 도움을 주시면 감사하겠습니다.

내가하는 일은 다음과 같습니다.

Job job = new Job("Some job") { 

    @Override 
    protected IStatus run(IProgressMonitor monitor) { 
    // Decide scaling amount 


    PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { 

    @Override 
    public void run() { 
     scalableLayeredPaneObj.setScale(scale);         } 
    }); 


    // Check if cancel is pressed and return status accordingly  
    if(monitor.isCanceled()) { 
     return Status.CANCEL_STATUS; 
    } 
     return Status.OK_STATUS; 
    } 
}; 

job.addJobChangeListener(new JobChangeAdapter() { 
    @Override 
    public void done(IJobChangeEvent event) { 
     if(event.getResult().isOK()) { 
      System.out.println("Job done!"); 
      // Do something 
     } else { 
      System.out.println("Job cancelled!"); 
      // Do something else 
     } 
    } 
}); 

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

그러나이 특정 코드를 실행하면 GUI가 응답하지 않고 취소 버튼을 누를 수 없습니다. 항상 "Job done!" 메시지를 받고 있습니다.

또한 UI 스레드를 실행하는 데 PlatformUI#getWorkbench()#getDisplay()#syncExec 메서드를 사용해 보았습니다. 그것은 작동하지 않았다.

내 분석에 따르면 setScale 작업 자체가 오랜 시간이 걸려 GUI가 응답하지 않는 것으로 나타났습니다. Main 스레드가 끊어지지 않도록 가능한 한 다른 스레드에서 setScale으로 전화해야합니다.

+1

문제를 설명하는 코드를 제시해야합니다. –

+0

@ greg-449 샘플 코드를 추가했습니다. 저 좀 도와 주 시겠어요. – SaurabhJinturkar

+0

당신의 분석에서 제안하는 것을해야한다고 말합니다. –

답변

0

문제는 setScale() 메서드에만 관련됩니다. 캔버스 크기가 크기 때문에 UI 스레드에서 setScale()이 오래 걸립니다.

기본적으로 Job은 백엔드에서 UI 이외의 활동을 수행하는 데 사용됩니다. UI 활동의 경우 busy indicator이 적합합니다. 그러나 스케일링 작업을 취소하고 싶었 기 때문에 사용자 Job을 사용하고있었습니다. 대신 통화 중 표시기를 사용하여 문제를 해결할 수 있으므로 취소 작업을 제공 할 수 없습니다.