快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳门威尼人斯老板是谁:关于Eclipse中UI程序的线程的讨论



虽然各个操作系统之间的线程机制是不一样的,然则大年夜致是相同的。当用户应用GUI法度榜样时,假如点鼠标或按下键盘上的键等时,操作系统会孕育发生对应的GUI事故,它来抉择哪个窗口或法度榜样来吸收每一个事故并且放到法度榜样的事故行列步队中.

任何GUI法度榜样的底层布局便是一个事故轮回.法度榜样首先初始化事故轮回,并开始轮回,这个轮回会从事故行列步队依次接管GUI事故并逐一做出响应的反映.法度榜样应该对事故做出快速的反映使法度榜样不停对用户有相应,举个例子,用户点了一下法度榜样里的一个按钮结果法度榜样就没反映了,那么这个法度榜样应该算是一个掉败的法度榜样吧.

假如某个UI事故激发了某个必要长光阴的事务,那么应该把它放到一个别的的零丁的线程中,这样法度榜样的那个事故轮回就能够顿时回来响利用户的下一个操作.线程是异常繁杂的一个主题,假如处置惩罚的不好很轻易造成逝世锁等很糟糕的环境.

还好,eclipse为我们开拓插件供给了一个方便的U澳门威尼人斯老板是谁I线程包,大年夜大年夜的简化了很多底层繁杂的器械.先看看几个简单的观点.

1.SWT UI线程

SWT用的是操作系统直接支持的线程模式,法度榜样会在主法度榜样里运行一个光阴轮回并依次在这个线程里相应事故.看下面这段代码,UI线程便是创建Display的那个线程.

public static void main (String [] args) {

Display display = new Display ();

Shell shell = new Shell (display);

shell.open ();

// 开始事故轮回

// 关掉落窗口后

while (!shell.isDisposed ()) {

if (!display.readAndDispatch ())

display.sleep ();

}

display.dispose ();

}

简单的小法度榜样里,一个UI线程就能够满意必要了。但假如是长光阴的操作,你就最好不要用UI线程来做这些事,可以交给Job去做.它着实便是别的启动的线程,也便是等会我要说的非UI线程.

2、Job

Job类由org.eclipse.core.runtime插件供给.它能够让客户法度榜样员轻松的在别的的线程中履行代码。看一个小例子:

Job job = new Job("My First Job") {

protected IStatus run(IProgressMonitor monitor) {

System.out.println("Hello World (from a background job)");

return Status.OK_STATUS;

}

};

job.setPrior澳门威尼人斯老板是谁ity(Job.SHORT);

job.schedule(); // start as soon as possible

Job的默认优先级是Job.Long,这里例子中的优先级要比它高,只要调用Job#schedule(),它就会尽快在别的的线程中运行run()中的代码。再看一个小例子:

final Job job = new Job("Long Running Job") {

protected IStatus run(IProgressMonitor monitor) {

try {

while(hasMoreWorkToDo()) {

// do some work

// ...

if (monitor.isCanceled()) return Status.CANCEL_STATUS;

}

return Status.OK_STATUS;

} finally {

schedule(60000); // start again in an hour

}

}

};

job.addJobChangeListener(new JobChangeAdapter() {

public void done(IJobChangeEvent event) {

if (event.getResult().isOK())

postMessage("Job completed successfully");

else

postError("Job did not complete successfully");

}

});

job.setSystem(true);

job.schedule(); // start as soon as possible

monitor是一个进度显示条,它会在运行job时自动显示,假如义务成功运行完成,返回Status.OK_STATUS,假如半途被用户在进度显示条那里中断,就返回Status.CANCEL_STATUS.上面schedule(60000);它是让job每过1小时就自动运行,Job又一个异常强大年夜的功能。然后后面是可以给job添加 监听 器,

job.setSystem(true);这一句是把这个job设置为系统级其余.假如调用setUser(true),那么就被定义为用户级其余,用户级别和默认级其余job。

在运行时会以UI形式反应出来,假如是用户job,那么会弹出一个进度显示窗口,能让用户选择在后台里运行,下图是一个job自动运行时的效果:

再先容job经常用到的一个措施Job#join(),系统调用到某个job,调用它的run()措施。再看下面这个例子:

class TrivialJob extends Job {

public TrivialJob() {

super("Trivial Job");

}

public IStatus run(IProgressMonitor monitor) {

System.out.println("This is a job");

return Status.OK_STATUS;

}

}

job的创建和计划如下所示:

TrivialJob job = new TrivialJob();

System.out.println("About to schedule a job");

job.schedule();

System.out.println("Finished scheduling a job");

他们的履行是和光阴不要紧的,输出可能如下:

About to schedule a job

This is a job

Finished scheduling a job

也可能是:

About to schedule a job

Fi澳门威尼人斯老板是谁ni澳门威尼人斯老板是谁shed scheduling a job

This is a job

假如盼望某个job运行完成后在继承时,可以应用join()措施,join()会不停壅闭到该job运行完。

例子:

TrivialJob job = new TrivialJob();

System.out.println("About to schedule a job");

job.schedule();

job.join();

if (job.getResult().isOk())

System.out.println("Job completed with success");

else

System.out.println("Job did not complete successfully");

上面的代码履行后,输出应该便是这样:

About to schedule a job

This is a job

Job completed with success

Job的功能是很强大年夜的,还有很多功能我今后会先容,也可以查阅官方赞助文档,这里先把几个常用的问题办理掉落。拜见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/runtime_jobs.htm

3、假如在Job中加上改变UI的代码就会掉败。缘故原由如下:

假如是在非UI线程中调用UI,SWT就会抛出一个SWTException,要在一个非UI线程改变UI的话有几种技巧:

第一种,用:

Display#syncExec(Runnable)或

Diaplay#asyncExec(Runnable)

第二种:

已经开拓了别的一种Job,便是UIJob,可以直接在它里面运行改变UI的代码,着实它便是在SWT的asyncExec()措施里运行的.所有承袭UIJob的类应该覆写runInUIThread措施而不是run措施。

3.关于进度显示

在Jface中:

org.eclipse.jface.operations包定义了一些接口用来在进度条下运行长光阴的义务。可以澳门威尼人斯老板是谁拜见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/jface_operations.htm

在eclipse插件和RCP开拓中:

用户级其余job是互操作性最强的,它不仅能够让用户用Cancel键取消job,而且可以在Detail中展示详细环境,然则留意:

Detail只会鄙人面两种措施中呈现:

IProgressService#busyCursorWhile或

IProgressService#runInUI

1)IProgressService#busyCursorWhile的用法规子:

留意这里的run()中做些和UI无关的事:

IProgressService progressService = PlatformUI.getWorkbench().getProgressService();

progressService.busyCursorWhile(new IRunnableWithProgress(){

public void run(IProgressMonitor monitor) {

//do non-UI work

}

});

效果:

2) IProgressService#runInUI的用法规子:

留意这里的run()中可以做些和UI有关的事。

progressService.runInUI(

PlatformUI.getWorkbench().getProgressService(),

new IRunnableWithProgress() {

public void run(IProgressMonitor monitor) {

//do UI work

}

},

Platform.getWorkspace().getRoot());

效果:

这里着末一个参数可所以null,或者是这个操作的规则,在这里我们是设定运行这个UI操作时锁定事情台.

加倍详细的可以拜见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_jobs.htm

别的,有少数时刻,我们不想弹出一个进度条窗口,而是只在最底下的状态栏显示就可以了,很简单,写自己的Job类时,在构造措施里加上一句:

setUser(false);就可以了.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: