2008年2月23日星期六

RCP,Eclipse中UI程序的线程

类MyAction:

public class MyAction implements IRunnableWithProgress {

@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
MyJob myJob = new MyJob("My Job ");
myJob
.addJobChangeListener(new MyJobChangeAdapter(Display
.getCurrent()));
myJob.setUser(true);
myJob.schedule();
monitor.subTask("Scheduled sending for recipient: ");
}

class MyJob extends Job {

public MyJob(String name) {
super(name);
}

@Override
protected IStatus run(IProgressMonitor monitor) {
try {
System.out.println("发呆中...");
Thread.sleep(15000);// 模拟一个需要10秒的工作
} catch (InterruptedException e) {
e.printStackTrace();
}
return Status.OK_STATUS;
}

}

class MyJobChangeAdapter extends JobChangeAdapter {

private final Display display;

/**
* @param display
*/
public MyJobChangeAdapter(Display display) {
super();
this.display = display;
}

/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void done(final IJobChangeEvent event) {
display.asyncExec(new Runnable() {
public void run() {
IStatus iStatus = event.getResult();
String errorMessage = iStatus.getMessage();

Shell shell = display.getActiveShell();
if (IStatus.OK == iStatus.getCode())
MessageDialog.openInformation(shell, event.getJob()
.getName(), "Mail Sent Successfully");
else
MessageDialog.openError(shell, "Error sending mail",
errorMessage);
}
});
}

}
}

测试类:ThreadTest

public class ThreadTest {

/**
* @param args
*/
public static void main(String[] args) {

final Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(600, 400);
shell.setLayout(new FillLayout());

MyAction myAction = new MyAction ();
ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog (Display.getCurrent().getActiveShell() );

boolean separateThread = false;
boolean cancelable = true;
try {
progressMonitorDialog.run (separateThread, cancelable, myAction);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}

display.dispose();


}

}

没有评论:

发表评论