码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-05-24 11:29:44      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:des   blog   c   code   java   tar   

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

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

bubuko.com,布布扣                ProgressMonitorDialog progress = new ProgressMonitorDialog(null); 
bubuko.com,布布扣                try {
bubuko.com,布布扣                    progress.run(truefalsenew IRunnableWithProgress() {
bubuko.com,布布扣                        public void run(IProgressMonitor monitor) throws InvocationTargetException,    InterruptedException {
bubuko.com,布布扣                            monitor.beginTask("复制文件", IProgressMonitor.UNKNOWN);
bubuko.com,布布扣                            monitor.setTaskName("复制文件bubuko.com,布布扣");
bubuko.com,布布扣                            Console.getInstance().info("正在复制文件,请稍候bubuko.com,布布扣");
bubuko.com,布布扣
bubuko.com,布布扣                            copyFile(fileName, destFolder);
bubuko.com,布布扣                            
bubuko.com,布布扣                            monitor.done();
bubuko.com,布布扣                            Console.getInstance().info("复制成功");
bubuko.com,布布扣                        }
 
bubuko.com,布布扣                    }
);
bubuko.com,布布扣                }
 catch (InvocationTargetException e) {
bubuko.com,布布扣                    e.printStackTrace();
bubuko.com,布布扣                }
 catch (InterruptedException e) {
bubuko.com,布布扣                    e.printStackTrace();
bubuko.com,布布扣                }

bubuko.com,布布扣

 

    若允许用户终止任务执行 则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线程的时间。

        也贴上例子吧:

 

bubuko.com,布布扣Job job = new Job("执行异步线程") {
bubuko.com,布布扣    protected IStatus run(final IProgressMonitor monitor) {    
bubuko.com,布布扣        monitor.beginTask("开始任务", IProgressMonitor.UNKNOWN);
bubuko.com,布布扣        monitor.setTaskName("Step 1bubuko.com,布布扣");
bubuko.com,布布扣        Console.getInstance().info("开始第一步bubuko.com,布布扣");
bubuko.com,布布扣        dothing1();
bubuko.com,布布扣        monitor.setTaskName("Step 2bubuko.com,布布扣");
bubuko.com,布布扣        Console.getInstance().info("开始第二步bubuko.com,布布扣");
bubuko.com,布布扣        dothing2();
bubuko.com,布布扣        monitor.setTaskName("Step 3bubuko.com,布布扣");
bubuko.com,布布扣        Console.getInstance().info("开始第三步bubuko.com,布布扣");
bubuko.com,布布扣        dothing3();
bubuko.com,布布扣        Console.getInstance().info("完毕");                                                                            
bubuko.com,布布扣        monitor.done();    
bubuko.com,布布扣        Display.getDefault().asyncExec(new Runnable() {                        
bubuko.com,布布扣            public void run() {                                                                                    
bubuko.com,布布扣                //UI任务
bubuko.com,布布扣
            }

bubuko.com,布布扣        }
);
bubuko.com,布布扣        return Status.OK_STATUS;
bubuko.com,布布扣    }

bubuko.com,布布扣}
;
bubuko.com,布布扣job.setUser(true);
bubuko.com,布布扣job.schedule();    

Eclipse RCP中超长任务单线程,异步线程处理,布布扣,bubuko.com

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

标签:des   blog   c   code   java   tar   

原文地址:http://www.cnblogs.com/cupsuccess/p/3748202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!