Eclipse中Job API使用总结如下三

1. 使用job的一个好处就是可以在后台运行。

但是如果不给用户于提示的话,很多时候会让用户很困惑,这就有必要增加回显。上面又说了,提供回显会增加复杂性。下面就是解决这个问题的方案!记得在第一部分,说过一个job有三个级别:systemuserdefault。只要不是system级的,就会有回显给用户。最常见的就是工作台右下角的进度显示:

图一

如果是用户级的,进一步,我们可以有一个进度对话框:

图二

用户级时,如果用户没有选择在后台运行,那么很容易判断工作完成,因为对话框会关闭。但是如果运行了在后台运行,或者是缺省级的,那又怎么办呢?当然最简单的,我们可以在progress view里查看:

 

图三
但是不能期待用户总是盯着这个看。这里给出解决方案,我们让工作台记住我们完成的结果,当点击图标时会弹出这个结果,示例如下:

 

 

首先定义这个job Job job = new Job("Online Reservation") { protected IStatus run(IProgressMonitor monitor) { // Make a reservation // ... setProperty(IProgressConstants.ICON_PROPERTY, Activator .getImageDescriptor("icons/sample.gif")); if (isModal(this)) { // The progress dialog is still open so // just open the message showResults(); } else { setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); setProperty(IProgressConstants.ACTION_PROPERTY, getReservationCompletedAction()); } return Status.OK_STATUS; } }; job.setUser(true); job.schedule();

 

 isModel()方法如下: public boolean isModal(Job job) { Boolean isModal = (Boolean) job .getProperty(IProgressConstants.PROPERTY_IN_DIALOG); if (isModal == null) return false; return isModal.booleanValue(); }

 

 

getReservationCompletedAction()方法如下:    protected static Action getReservationCompletedAction() { return new Action("View reservation status") { public void run() { MessageDialog.openInformation(Display.getDefault() .getActiveShell(), "Reservation Complete", "Your reservation has been completed"); } }; }
 

 

showResults() 方法如下:     protected static void showResults() { Display.getDefault().asyncExec(new Runnable() { public void run() { getReservationCompletedAction().run(); } }); }
 

 

更多的用法,可以参见job的帮助和IProgressConstants常量的用法!这里当使用对话框等待时,当任务结束后,信息对话框弹出有问题!有一个非法管理状态异常!大家可以试试!最后运行结果大致如下:

 

图四

OK出现对话框!

 

2. job进行分组。

有可以多个job都同属于一个逻辑任务,这时可以对这些job进行分组,使用job的如下方法:setProgressGroup()具体的看job的帮助!

 

3. 保护数据的完整性

上面介绍的都是一些互斥访问的实现,没有讲到数据完整性的保护!在eclipseorg.eclispe.core.runtime插件中提供了一种锁的机制,用来保护数据在被操作时不会被打断。使用方式如下:private static ILock lock = Platform.getJobManager().newLock(); try { lock.acquire(); // Access or modify data structure } finally { lock.release(); }

   

 注意,try-finally块是必须的,用于确保在任何时候锁都能够被释放!这里也提示一下,在请求资源锁时,也应该做同样的事情!  好,以上就是所有的总结的内容!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值