正 文

关于Eclipse中UI程序的线程的讨论


www.7dspace.com  更新日期:2006-1-14 4:56:55  七度空间


  再介绍job常常用到的一个方法Job#join(),系统调用到某个job,调用它的run()方法。再看下面这个例子:

    class TrivialJob extends Job {
      public TrivialJob() {
         super("Trivial Job");
      }
      public IStatus run(IProgressMonitor monitor) {
         System.out.println("This is a job");
         return Status.OK_STATUS;
      }
   }

  job的创建和计划如下所示:

   TrivialJob job = new TrivialJob();
   System.out.println("About to schedule a job");
   job.schedule();
   System.out.println("Finished scheduling a job");

  他们的执行是和时间没关系的,输出可能如下:

   About to schedule a job
   This is a job
   Finished scheduling a job

  也可能是:

   About to schedule a job
   Finished scheduling a job
   This is a job

  如果希望某个job运行完成后在继续时,可以使用join()方法,join()会一直阻塞到该job运行完。

  例子:

   TrivialJob job = new TrivialJob();
   System.out.println("About to schedule a job");
   job.schedule();
   job.join();
   if (job.getResult().isOk())
      System.out.println("Job completed with success");
   else
      System.out.println("Job did not complete successfully");

  上面的代码执行后,输出应该就是这样:

 About to schedule a job
   This is a job
   Job completed with success

  Job的功能是很强大的,还有很多功能我以后会介绍,也可以查阅官方帮助文档,这里先把几个常用的问题解决掉。参见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/runtime_jobs.htm

  3、如果在Job中加上改变UI的代码就会失败。原因如下:

  如果是在非UI线程中调用UI,SWT就会抛出一个SWTException,要在一个非UI线程改变UI的话有几种技术:

  第一种,用:

Display#syncExec(Runnable)或
Diaplay#asyncExec(Runnable)

  第二种:

  已经开发了另外一种Job,就是UIJob,可以直接在它里面运行改变UI的代码,其实它就是在SWT的asyncExec()方法里运行的.所有继承UIJob的类应该覆写runInUIThread方法而不是run方法。

  3.关于进度显示

  在Jface中:

  org.eclipse.jface.operations包定义了一些接口用来在进度条下运行长时间的任务。可以参见:
http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/jface_operations.htm

  在eclipse插件和RCP开发中:

  用户级别的job是互操作性最强的,它不仅能够让用户用Cancel键取消job,而且可以在Detail中展示具体情况,但是注意:

  Detail只会在下面两种方法中出现:

  IProgressService#busyCursorWhile或
  IProgressService#runInUI

  1)IProgressService#busyCursorWhile的用法例子:

  注意这里的run()中做些和UI无关的事:

IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
   progressService.busyCursorWhile(new IRunnableWithProgress(){
      public void run(IProgressMonitor monitor) {
         //do non-UI work
      }
   });

  效果:

  2) IProgressService#runInUI的用法例子:

  注意这里的run()中可以做些和UI有关的事。

progressService.runInUI(
      PlatformUI.getWorkbench().getProgressService(),
      new IRunnableWithProgress() {
         public void run(IProgressMonitor monitor) {
            //do UI work
         }
      },
      Platform.getWorkspace().getRoot());

  效果:

  这里最后一个参数可以是null,或者是这个操作的规则,在这里我们是设定运行这个UI操作时锁定工作台.

  更加具体的可以参见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_jobs.htm

  另外,有少数时候,我们不想弹出一个进度条窗口,而是只在最底下的状态栏显示就可以了,很简单,写自己的Job类时,在构造方法里加上一句:setUser(false);就可以了.

2页,页码:[1] [2] 

上一篇:Adobe Flash 2006发展趋势预测
下一篇:J2EE开发框架发展简史
标题:关于Eclipse中UI程序的线程的讨论 作者:starshus 来源:blog
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐