Eclipse rcp 如何在eclipse作业中管理单独的线程/作业?

Eclipse rcp 如何在eclipse作业中管理单独的线程/作业?,eclipse-rcp,Eclipse Rcp,我的问题是:- 我正在构建一个客户机-服务器应用程序,在该应用程序中,我将请求发布到服务器以生成2个XML for-me服务器,该服务器从数据库获取信息,并基于此获取的信息生成XML。现在,一旦服务器创建了这两个XML,服务器就会将这两个文件流回到客户机,以便客户机可以将它们保存在机器上 发布+读取流是一项工作。如果没有第二次操作,即从流读取,则作业不完整 我在eclipse中创建了一个作业,它将请求发布到服务器,获取流文件并将其保存在客户端机器上。将请求发布到服务器是一个异步调用,它将立即返回

我的问题是:-

我正在构建一个客户机-服务器应用程序,在该应用程序中,我将请求发布到服务器以生成2个XML for-me服务器,该服务器从数据库获取信息,并基于此获取的信息生成XML。现在,一旦服务器创建了这两个XML,服务器就会将这两个文件流回到客户机,以便客户机可以将它们保存在机器上

发布+读取流是一项工作。如果没有第二次操作,即从流读取,则作业不完整

我在eclipse中创建了一个作业,它将请求发布到服务器,获取流文件并将其保存在客户端机器上。将请求发布到服务器是一个异步调用,它将立即返回。一旦调用被发布并立即返回,我就开始在网络管道上轮询服务器发送的任何数据。在这种情况下,它是XML的数据并将其写入文件

正如您在这里看到的,从流中读取XML并将其写入文件是整个主作业的一部分,但是,单独的作业本身应该在单独的线程中运行。如果用户取消主作业,则还应取消从网络流读取

所以,基本上,我的要求是一份可以胜任的工作,完成整个工作。从流中读取应该是单独的线程/作业,但应该在主作业中。如果用户取消主作业,则从该作业读取的此Inner作业也应被取消

你们能建议一个干净的方法吗


-Ankit

您可以创建主作业,并在该主作业中创建子作业。如果主作业被取消,您可以将取消委派给子作业

我创建了一个带有两个按钮的简单视图。一个用于启动作业,另一个用于取消

包装试验; 导入org.eclipse.core.runtime.IProgressMonitor; 导入org.eclipse.core.runtime.IStatus; 导入org.eclipse.core.runtime.Status; 导入org.eclipse.core.runtime.jobs.IJobChangeEvent; 导入org.eclipse.core.runtime.jobs.Job; 导入org.eclipse.core.runtime.jobs.JobChangeAdapter; 导入org.eclipse.swt.swt; 导入org.eclipse.swt.events.SelectionAdapter; 导入org.eclipse.swt.events.SelectionEvent; 导入org.eclipse.swt.widgets.Button; 导入org.eclipse.swt.widgets.Composite; 导入org.eclipse.ui.part.ViewPart; 公共类视图扩展了ViewPart { 私人工作主要工作; @凌驾 公共void createPartControlfinal复合父级 { 最终按钮=新按钮租金,SWT.PUSH; button.setTextStart作业; button.AddSelectionListener新建选择适配器 { @凌驾 公共无效widgetSelectedfinal SelectionEvent e { mainJob=新作业main Job { 私有布尔值=false; @凌驾 保护无效取消 { 已请求System.out.PrintLnConcel。; 取消=真; } @凌驾 受保护的IStatus runfinal IProgressMonitor监视器 { 最终作业子作业=创建子作业; 附属时间表; 取消=假; 半天!取消了 { 尝试 { 线程100; } 捕捉最终中断异常e { } } 取消; System.out.printlnMain作业已取消。; 返回状态。取消状态; } 私人工作 { 返回新工单子工单 { 布尔值subbocancel=false; @凌驾 保护无效取消 { subjectobcancel=true; } @凌驾 受保护的IStatus runfinal IProgressMonitor监视器 { System.out.printlnSub作业已启动。; 等一下!取消 { 尝试 { 线程100; } 捕捉最终中断异常e { } } System.out.printlnSub作业已取消; 返回状态。取消状态; } }; } }; mainJob.addJobChangeListenernew JobChangeAdapter { @凌驾 public void donefinal ijobchangevent事件 { System.out.printlnJob由+event.getResult完成; } }; mainJob.schedule; System.out.printlnMain作业已启动。; }; }; 最终按钮取消=新按钮租金,SWT.PUSH; cancel.setTextCancel; cancel.AddSelectionListener新建选择适配器 { @凌驾 公共无效widgetSelectedfinal SelectionEvent e { mainJob.cancel; } }; } /**{@inheritardoc} */ @凌驾 公共焦点 { } }
我希望这就是您想要的。

您可以创建一个主作业,并在该主作业中创建一个子作业。如果主作业被取消,您可以将取消委派给子作业

我创建了一个带有两个按钮的简单视图。一个用于启动作业,另一个用于取消

包装试验; 导入org.eclipse.core.runtime.IProgressMonitor; 导入org.eclipse.core.runtime.IStatus; 导入org.eclipse.core.runtime.Status; 导入org.eclipse.core.runtime.jobs.IJobChangeEvent; 导入org.eclipse.core.runtime.jobs.Job; 导入org.eclipse.core.runtime.jobs.JobChangeAdapter; 导入org.eclipse.swt.swt; 导入org.eclipse.swt.events.SelectionAdapter; 导入org.eclipse.swt.events.SelectionEvent; 导入org.eclipse.swt.widgets.Button; 导入org.eclipse.swt.widgets.Composite; 导入org.eclipse.ui.part.ViewPart; 公共类视图扩展了ViewPart { 私人工作主要工作; @凌驾 公共void createPartControlfinal复合父级 { 最终按钮=新按钮租金,SWT.PUSH; button.setTextStart作业; button.AddSelectionListener新建选择适配器 { @凌驾 公共无效widgetSelectedfinal SelectionEvent e { mainJob=新作业main Job { 私有布尔值=false; @凌驾 保护无效取消 { 已请求System.out.PrintLnConcel。; 取消=真; } @凌驾 受保护的IStatus runfinal IProgressMonitor监视器 { 最终作业子作业=创建子作业; 附属时间表; 取消=假; 半天!取消了 { 尝试 { 线程100; } 捕捉最终中断异常e { } } 取消; System.out.printlnMain作业已取消。; 返回状态。取消状态; } 私人工作 { 返回新工单子工单 { 布尔值subbocancel=false; @凌驾 保护无效取消 { subjectobcancel=true; } @凌驾 受保护的IStatus runfinal IProgressMonitor监视器 { System.out.printlnSub作业已启动。; 等一下!取消 { 尝试 { 线程100; } 捕捉最终中断异常e { } } System.out.printlnSub作业已取消; 返回状态。取消状态; } }; } }; mainJob.addJobChangeListenernew JobChangeAdapter { @凌驾 public void donefinal ijobchangevent事件 { System.out.printlnJob由+event.getResult完成; } }; mainJob.schedule; System.out.printlnMain作业已启动。; }; }; 最终按钮取消=新按钮租金,SWT.PUSH; cancel.setTextCancel; cancel.AddSelectionListener新建选择适配器 { @凌驾 公共无效widgetSelectedfinal SelectionEvent e { mainJob.cancel; } }; } /**{@inheritardoc}*/ @凌驾 公共焦点 { } }
我希望这就是你想要的。

在我看来,按照Micheal K.的建议来定义主题似乎有点麻烦。因此,我深入研究了Eclipse文档,发现该类定义了一个名为createProgressGroup的静态方法,可以按如下方式使用相同的文档,该文档的功能大致相同:

Job parseJob, compileJob;
IProgressMonitor pm = Job.getJobManager().createProgressGroup();
try {
   pm.beginTask("Building", 10);
   parseJob.setProgressGroup(pm, 5);
   parseJob.schedule();
   compileJob.setProgressGroup(pm, 5);
   compileJob.schedule();
   parseJob.join();
   compileJob.join();
} finally {
   pm.done();
}

请注意,IJobManager.getJobManager已弃用

在我看来,按照Micheal K.的建议来定义主题似乎有点麻烦。因此,我深入研究了Eclipse文档,发现该类定义了一个名为createProgressGroup的静态方法,可以按如下方式使用相同的文档,该文档的功能大致相同:

Job parseJob, compileJob;
IProgressMonitor pm = Job.getJobManager().createProgressGroup();
try {
   pm.beginTask("Building", 10);
   parseJob.setProgressGroup(pm, 5);
   parseJob.schedule();
   compileJob.setProgressGroup(pm, 5);
   compileJob.schedule();
   parseJob.join();
   compileJob.join();
} finally {
   pm.done();
}

请注意,IJobManager.getJobManager已弃用

非常感谢,迈克尔。它非常接近我需要的东西。你的回答肯定给了我一个方向。我将根据我的要求修改代码。再次感谢汉克斯,迈克尔。它非常接近我需要的东西。你的回答肯定给了我一个方向。我将根据我的要求修改代码。再次感谢