獨(dú)自等待
          那曾經(jīng)從自己身邊溜走的人……
          posts - 0,comments - 3,trackbacks - 0

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

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

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

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

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

                  也貼上例子吧:

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

                  }
          );
                  
          return Status.OK_STATUS;
              }

          }
          ;
          job.setUser(
          true);
          job.schedule();    
          posted on 2008-12-12 19:57 自由 閱讀(1081) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): EclipseJava
          主站蜘蛛池模板: 泰州市| 邛崃市| 呈贡县| 乾安县| 灌南县| 柏乡县| 祁阳县| 盈江县| 萨嘎县| 五莲县| 蒙阴县| 宝丰县| 宜宾市| 郁南县| 缙云县| 肥西县| 禄劝| 康马县| 德化县| 鄂托克旗| 长治市| 天峻县| 松潘县| 临猗县| 高阳县| 大理市| 车险| 简阳市| 巴楚县| 广丰县| 乌鲁木齐市| 仁怀市| 德令哈市| 靖安县| 正安县| 且末县| 吴桥县| 栾城县| 宝应县| 涞水县| 广平县|