Eclipse RCP中超长任务单线程,异步线程处理
2024-10-15 09:21:29
转自:http://www.blogjava.net/mydearvivian/articles/246028.html
在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是很糟糕的,如用户点了一个功能按钮后,进入功能执行,发现程序长时间没有任何响应,无疑这种情况下,用户是无法忍受的。
在这种情况下我们可以通过提供进度条对话框来改善用户体验度:
1)单步执行
程序执行期间不允许用户终止,贴下程序代码段
ProgressMonitorDialog progress = new ProgressMonitorDialog(null);
try {
progress.run(true, false, new 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();
}
try {
progress.run(true, false, new 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();
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();
最新文章
- 服务器判断http是否中断
- WSAStartup
- 将普通工程转为mvn标准工程(main resources)
- php ldap验证
- [uwp开发]数据绑定那些事(2)
- ionic中登陆逻辑控制
- /sbin/ifup: configuration for eth0 not found解决
- [linux]scp指令(转)
- DDD社区官网
- GourdScan &; sqlmapapi
- @NotNull和@NotEmpty和@NotBlank区别
- H5canvas基础
- Linux 学习笔记_12_Windows与Linux文件共享服务_1.1_--Samba(下)Samba经典应用案例
- Linux C系统编程:信号与定时器的使用
- SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么
- c++中函数指针作为int传递
- mysql文件
- 通过微信Android和iOS版,看两大系统的差异
- BZOJ3293: [Cqoi2011]分金币(数学)
- 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇