Eclipse RCP中超长任务单线程,异步线程处理

转自:http://www.blogjava.net/mydearvivian/articles/246028.html

在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是很糟糕的,如用户点了一个功能按钮后,进入功能执行,发现程序长时间没有任何响应,无疑这种情况下,用户是无法忍受的。
    在这种情况下我们可以通过提供进度条对话框来改善用户体验度:
     1)单步执行
            程序执行期间不允许用户终止,贴下程序代码段
            

                ProgressMonitorDialog progress =  new ProgressMonitorDialog( null); 
                 try  {
                    progress.run(true, false, new 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();
                }

 

    若允许用户终止任务执行 则progress.run()第二个参数传true即可; monitor.isCanceled()方法判断当前是否被用户取消

    2)异步执行
    在RCP中要在非UI线程中执行UI线程的操作,最简单的方式就是display.syncExec或者display.asyncExec,如果UI线程所需的时间较长的话,则应该使用display.asyncExec
       在执行异步线程的时候,我们一般应当继承Job或者UIJob类:UIJob是在UI线程中运行的,可以直接访问窗体组件。Job是在非UI线程中运行,如果在里面想访问窗体组件,需要通过Display.asynExec()或者synExec方式来执行。UIJob要尽量的短,不要过多的占用UI线程的时间。

        也贴上例子吧:

 

Job job =  new Job("执行异步线程")  {
    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();    

转载于:https://www.cnblogs.com/cupsuccess/p/3748202.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值