public void setGifImage(InputStream inputStream) {
checkWidget();
if (thread != null) {
thread.stopRunning();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ImageLoader loader = new ImageLoader();
try {
loader.load(inputStream);
} catch (Exception e) {
this.image = null;
return;
}
if (loader.data[0] != null){
System.out.println("set to new picture");
this.image = new Image(this.getDisplay(), loader.data[0]);
}
if (loader.data.length > 1) {
System.out.println("start animation");
thread = new GifThread(loader);
thread.start();
}else{
System.out.println("paint static picture");
}
redraw();
}
the thread :
private class GifThread extends Thread {
private int imageNumber = 0;
private ImageLoader loader = null;
private boolean run = true;
public GifThread(ImageLoader loader) {
this.loader = loader;
}
public void run() {
while (run) {
int delayTime = loader.data[imageNumber].delayTime;
try {
Thread.sleep(delayTime * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!GifCLabel.this.isDisposed()) {
// if a asynchronous thread is running, this new runnable will be queued
GifCLabel.this.getDisplay().asyncExec(new Runnable() {
public void run() {
if (!GifCLabel.this.isDisposed()) {
imageNumber = imageNumber == loader.data.length - 1 ? 0 : imageNumber + 1;
if (!GifCLabel.this.image.isDisposed())
GifCLabel.this.image.dispose();
ImageData nextFrameData = loader.data[imageNumber];
System.out.println("set to frame " + imageNumber);
GifCLabel.this.image = new Image(GifCLabel.this.getDisplay(), nextFrameData);
GifCLabel.this.redraw();
} else
stopRunning();
}
});
} else
stopRunning();
}
}
public void stopRunning() {
run = false;
}
}
the output :
2011-08-10 03:44:24 DEBUG - 日志服务Ready!
2011-08-10 03:44:28 DEBUG - current is null
2011-08-10 03:44:28 DEBUG - found : amarsoft.dbmp.function.ui.FunctionListPage@1079ff
2011-08-10 03:44:28 DEBUG - can go back ? false
2011-08-10 03:44:28 DEBUG - can go forward ? false
set to new picture
start animation
2011-08-10 03:44:28 DEBUG - 尝试连接至 - jdbc:mysql://localhost:3306/credit 驱动配置:MySQL 驱动类:com.mysql.jdbc.Driver@1f7abae 连接属性:{user=root, password=root}
set to frame 1
set to frame 2
set to frame 3
set to frame 4
[amarsoft.dbmp.function.ui.FunctionListPage$1@29f93b, amarsoft.dbmp.function.ui.FunctionView$1@1a998c7]
set to new picture
paint static picture
set to frame 5
I wonder why the thread still run after thread.join()? As I know, thread.join() wait thread to die,but you can see the last line in output, thread run after die…
The issue here is that you thread calls
getDisplay().asyncExec()which basically sends event to UI thread to execute the Runnable that prints"set to frame ".Better to use
syncExec()and checkrunvariable status inside Runnable too.Another hints:
InterruptedExceptionand do nothing.interruptinsidestopRunnable()runvariable status aftersleepends.Cheers,
Max