Eclipse插件开发:进度栏停止按钮无法终止任务的问题
Eclipse插件进度任务终止问题解决
核心逻辑
Eclipse进度对话框的停止按钮无需手动添加监听器,点击后会自动调用关联IProgressMonitor的setCanceled(true)。任务无法终止的根本原因是你没有在任务执行流程中定期检查取消状态。
具体实现步骤
1. 在任务关键节点检查取消状态
在任务代码的循环、耗时操作前后,主动调用monitor.isCanceled()判断,一旦返回true,立即终止任务并清理资源:
public void run(IProgressMonitor monitor) throws CoreException { monitor.beginTask("执行耗时任务", 100); try { for (int i = 0; i < 10; i++) { // 每次执行子任务前检查是否被取消 if (monitor.isCanceled()) { throw new OperationCanceledException("用户终止任务"); } // 执行具体业务逻辑 executeSubTask(); // 更新进度 monitor.worked(10); } } finally { monitor.done(); } }
2. 正确启动可取消的进度任务
使用ProgressMonitorDialog启动任务时,需传入允许取消的参数(第一个true),对话框会自动绑定停止按钮的取消逻辑:
// 在UI线程中触发任务 new ProgressMonitorDialog(getShell()).run(true, true, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { // 调用你的任务实现 yourTask.run(monitor); } });
参数说明:
- 第一个
true:允许用户取消任务 - 第二个
true:在后台线程执行任务,避免阻塞UI
IProgressMonitor关键方法翻译(来自官方API)
isCanceled():返回此监视器是否已被取消。一旦标记为取消,状态将保持不变。setCanceled(boolean canceled):设置监视器的取消状态。传入true时,标记任务应被终止。
注意事项
- 避免在长时间阻塞的IO/计算操作中忽略取消检查,尽量把大任务拆分为多个可中断的小步骤。
- 若任务涉及子线程,需确保取消状态能被传递到子线程,或子线程定期检查主监视器的状态。
内容的提问来源于stack exchange,提问作者Pravesh Gurjar
相关产品推荐
相关产品推荐

