一杯清茶

          統(tǒng)計

          留言簿

          Oracle SQL/PLSQL

          PowerDesigner教程系列

          Struts2.0

          web開發(fā)

          三人行

          從事RCP開發(fā)的同行

          工作流和權(quán)限設(shè)置

          閱讀排行榜

          評論排行榜

          Eclipse RCP中超長任務單線程,異步線程處理

          轉(zhuǎn)自:http://www.aygfsteel.com/mydearvivian/articles/246028.html

          在RCP程序中,常碰到某個線程執(zhí)行時間比較很長的情況,若處理不好,用戶體驗度是很糟糕的,如用戶點了一個功能按鈕后,進入功能執(zhí)行,發(fā)現(xiàn)程序長時間沒有任何響應,無疑這種情況下,用戶是無法忍受的。
              在這種情況下我們可以通過提供進度條對話框來改善用戶體驗度:
               1)單步執(zhí)行
                      程序執(zhí)行期間不允許用戶終止,貼下程序代碼段
                      

                          ProgressMonitorDialog progress = new ProgressMonitorDialog(null); 
                          
          try {
                              progress.run(
          truefalsenew IRunnableWithProgress() {
                                  
          public void run(IProgressMonitor monitor) throws InvocationTargetException,    InterruptedException {
                                      monitor.beginTask(
          "復制文件", IProgressMonitor.UNKNOWN);
                                      monitor.setTaskName(
          "復制文件");
                                      Console.getInstance().info(
          "正在復制文件,請稍候");

                                      copyFile(fileName, destFolder);
                                      
                                      monitor.done();
                                      Console.getInstance().info(
          "復制成功");
                                  }
           
                              }
          );
                          }
           catch (InvocationTargetException e) {
                              e.printStackTrace();
                          }
           catch (InterruptedException e) {
                              e.printStackTrace();
                          }

           

              若允許用戶終止任務執(zhí)行 則progress.run()第二個參數(shù)傳true即可; monitor.isCanceled()方法判斷當前是否被用戶取消

              2)異步執(zhí)行
              在RCP中要在非UI線程中執(zhí)行UI線程的操作,最簡單的方式就是display.syncExec或者display.asyncExec,如果UI線程所需的時間較長的話,則應該使用display.asyncExec
                 在執(zhí)行異步線程的時候,我們一般應當繼承Job或者UIJob類:UIJob是在UI線程中運行的,可以直接訪問窗體組件。Job是在非UI線程中運行,如果在里面想訪問窗體組件,需要通過Display.asynExec()或者synExec方式來執(zhí)行。UIJob要盡量的短,不要過多的占用UI線程的時間。

                  也貼上例子吧:

           

          Job job = new Job("執(zhí)行異步線程"{
              
          protected IStatus run(final IProgressMonitor monitor) {    
                  monitor.beginTask(
          "開始任務", IProgressMonitor.UNKNOWN);
                  monitor.setTaskName(
          "Step 1");
                  Console.getInstance().info(
          "開始第一步");
                  dothing1();
                  monitor.setTaskName(
          "Step 2");
                  Console.getInstance().info(
          "開始第二步");
                  dothing2();
                  monitor.setTaskName(
          "Step 3");
                  Console.getInstance().info(
          "開始第三步");
                  dothing3();
                  Console.getInstance().info(
          "完畢");                                                                            
                  monitor.done();    
                  Display.getDefault().asyncExec(
          new Runnable() {                        
                      
          public void run() {                                                                                    
                          
          //UI任務
                      }

                  }
          );
                  
          return Status.OK_STATUS;
              }

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

          posted on 2009-07-08 14:50 一杯清茶 閱讀(1278) 評論(1)  編輯  收藏 所屬分類: RCP

          評論

          # re: Eclipse RCP中超長任務單線程,異步線程處理 2009-07-09 04:13 jadmin

          很好,學習了  回復  更多評論   

          主站蜘蛛池模板: 胶南市| 雷州市| 广元市| 那坡县| 平阳县| 芜湖县| 芷江| 团风县| 石泉县| 浠水县| 梁平县| 林周县| 新昌县| 莆田市| 景德镇市| 古田县| 板桥市| 高雄县| 广平县| 宁德市| 玉屏| 宜兰市| 临高县| 武宁县| 仲巴县| 开阳县| 库伦旗| 丹江口市| 阿克| 长岛县| 石棉县| 瓦房店市| 桃园县| 乌拉特前旗| 阳原县| 远安县| 富宁县| 尼玛县| 潼南县| 德钦县| 得荣县|