2013-12-17 55 views
-1

我正在使用eclipse RCP應用程序。 我有一個ScalableLayeredPane我有大約800個數字。無法使用作業取消縮放操作

我需要通過使用setScale()方法更改縮放值。

另外我想使用作業顯示縮放的進度。

我正在使用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!"消息。

我也嘗試使用PlatformUI#getWorkbench()#getDisplay()#syncExec方法來運行UI線程。這沒有用。

我的分析表明setScale操作本身需要很長時間,因此GUI無法響應。我需要從另一個線程調用setScale(如果可能),以便Main線程不會掛斷。

+1

您需要向我們展示一些展示問題的代碼。 –

+0

@ greg-449我已添加示例代碼。你可以幫我嗎。 – SaurabhJinturkar

+0

我說你應該做你的分析建議:) –

回答

0

問題僅與setScale()方法有關。由於較大的畫布大小,setScale()在UI線程中花費很長時間。基本上Job用於在後端執行非UI活動。對於UI活動,busy indicator是適合的。但是,因爲我想取消縮放任務,所以我使用用戶Job。問題可以使用繁忙指示符來解決,因此不能提供取消操作。