zoukankan      html  css  js  c++  java
  • Eclipse RCP中超长任务单线程,异步线程处理

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

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

                    ProgressMonitorDialog progress = new ProgressMonitorDialog(null); 
                    try {
                        progress.run(truefalsenew 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();    
  • 相关阅读:
    28.数组中出现次数超过长度一半的数字(python)
    [leetcode] 145. 二叉树的后序遍历
    [leetcode] 144. 二叉树的前序遍历
    [leetcode] 94. 二叉树的中序遍历
    [leetcode] 93. 复原IP地址
    [leetcode] 206. 反转链表
    [leetcode] 92. 反转链表 II
    [leetcode] 91. 解码方法
    [leetcode] 90. 子集 II.md
    [leetcode] 88. 合并两个有序数组
  • 原文地址:https://www.cnblogs.com/cupsuccess/p/3748202.html
Copyright © 2011-2022 走看看