如何避免带进度条的SWT界面假死

转载请注明:http://zazawind.3snavi.com

在编写带进度条的SWT界面程序时,通常会因为某个任务执行需要花费大量时间(下文称为“大任务”),而导致主界面无法响应用户其它操作。比如主界面上有进度条用于显示大任务执行进度,此时大任务如果直接在主线程(UI线程)执行,程序界面要么别动,进度会正常显示,只要一动界面,可能就是白白一片了。
解决此类问题的基本方法就是使用派生线程来执行大任务。
比如按钮响应如下动作:
doJob(){
int cnt = 1000000000000;
for( int i=0; i doSomething();
progressBar.setSelection( progressBar.getSelection()+1 );
}
}
修改成派生线程后,其基本写法如下。
doJob(){
JobThread jt = new JobThread();
Jt.setParent( shell );
Jt.setProgressBar( progressBar );
Jt.start();
}
Public class JobThread extends Thread(){
Private ProgressBar bar = null;
Private Composite parent = null;
Public void setProgressBar( ProgressBar bar){
This.bar = bar;
}
Public void setParent( Composite p ){
This.parent = p;
}
Public void run(){
int cnt = 1000000000000;
for( int i=0; i //执行某一个任务
doSomething();
//异步调用UI主线程
parent.getDisplay().asyncExec( new Runnable(){
progressBar.setSelection( progressBar.getSelection()+1 );
}
}
}
}
需要注意的是,任务执行一定要放在线程的run里面去执行才能利用线程,而不能放到异步调用UI线程那部分。否则效果就大打折扣了,具体折扣到何种程度,视UI和任务本身情况而定。
错误调用方法:
Public class JobThread extends Thread(){
Private ProgressBar bar = null;
Private Composite parent = null;
Public void setProgressBar( ProgressBar bar){
This.bar = bar;
}
Public void setParent( Composite p ){
This.parent = p;
}
Public void run(){
//异步调用UI主线程
parent.getDisplay().asyncExec( new Runnable(){
int cnt = 1000000000000;
for( int i=0; i //执行某一个任务
doSomething();
progressBar.setSelection( progressBar.getSelection()+1 );
}
}
}
}

你可能感兴趣的:(Java)