由于是一个检测服务器是否联通的测试,所以并不知道测试的真实时间,所以就是要使用“傻瓜进度条”了,也就是反复走的进度条陈刚的代码如下:
|
button.addSelectionListener(new SelectionAdapter() { private void go() { } try { Thread.sleep(1000); } catch (Throwable t) {} } stopFlag = true;// 执行完毕后把标志位设为停止,好通知给进度框 System.out.println("全部任务执行完毕"); } public void widgetSelected(SelectionEvent e) { } private void showProgressDialog() { } monitor.done();// 进度条前进到完成 } }; try { new ProgressMonitorDialog(s).run(true, true, runnable); } catch (Exception e) { e.printStackTrace(); } } }); |
主要是使用两个线程交替使用,第一个线程处理业务,第二个线程监控第一个线程查看它是否结束,如果结束或者被点击cancele则停止进度条的进程,如果一直没有关闭的指令,则反复开始---累加---结束---开始---累加---结束。
我们几乎是把陈刚的代码原原本本的抄袭了一下,仅仅是替换了go()中的内容,但是发现一个问题
new ProgressMonitorDialog(s).run(true, true, runnable);
使用此句的话,JFace的线程永远不会启动;
替换为
new ProgressMonitorDialog(s).run(false, true, runnable);
使用此句的话,JFace的线程可以启动,运行正常,但是cancele不能响应,UI界面完全卡死!
第一个参数的名字fork~乍看去,什么意思都没有,但是看看API才发现内藏很大的玄机,如果为true则此线程为一个非UI线程,大家知道非UI线程 是不会阻塞UI的;如果为false则此线程为一个UI线程,大家也知道UI线程如果使用不当很容易阻塞UI的。
关键的问题是我们和陈刚的代码几乎一摸一样他的进度条就启动,我的进度条就不启动!为什么?(这点至今不明白!)
详查API发现如果fork为false的时候还是另有洞天的:
|
This implementation of IRunnableContext#run(boolean, boolean, IRunnableWithProgress) runs the given |
API中说的很明白,如果fork为false时需要在线程中调用Display.readAndDispatch()方法,以避免UI被阻塞!
大家如果在JFace的开发中如果使用了进度条,发现UI被阻塞的话,就想想我哦!!!呵呵只用在进程中调用一下Display.readAndDispatch()就解决了!