|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的程序 固然各个操纵体系之间的线程机制是纷歧样的,可是大抵是不异的。当用户利用GUI程序时,假如点鼠标或按下键盘上的键等时,操纵体系会发生对应的GUI事务,它来决意哪一个窗口或程序来承受每个事务而且放到程序的事务行列中.
任何GUI程序的底层布局就是一个事务轮回.程序起首初始化事务轮回,并入手下手轮回,这个轮回会处置件行列顺次吸收GUI事务并逐一做出响应的反响.程序应当对事务做出疾速的反响使程序一向对用户有呼应,举个例子,用户点了一下程序里的一个按钮了局程序就没反响了,那末这个程序应当算是一个失利的程序吧.
假如某个UI事务激发了某个必要长工夫的事件,那末应当把它放到一个别的的独自的线程中,如许程序的谁人事务轮回就可以够即刻返来呼应用户的下一个操纵.线程长短常庞大的一个主题,假如处置的欠好很简单形成逝世锁等很糟的情形.还好,eclipse为我们开辟插件供应了一个便利的UI线程包,年夜年夜的简化了良多底层庞大的工具.先看看几个复杂的观点.
1.SWTUI线程
SWT用的是操纵体系间接撑持的线程形式,程序会在主程序里运转一个工夫轮回并顺次在这个线程里呼应事务.看上面这段代码,UI线程就是创立Display的谁人线程.
publicstaticvoidmain(String[]args){
Displaydisplay=newDisplay();
Shellshell=newShell(display);
shell.open();
//入手下手事务轮回
//关失落窗口后
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
复杂的小程序里,一个UI线程就可以够满意必要了。但假如是长工夫的操纵,你就最好不要用UI线程来做这些事,能够交给Job往做.它实在就是别的启动的线程,也就是等会我要说的非UI线程.
2、Job
Job类由org.eclipse.core.runtime插件供应.它可以让客户程序员轻松的在别的的线程中实行代码。看一个小例子:
Jobjob=newJob("MyFirstJob"){
protectedIStatusrun(IProgressMonitormonitor){
System.out.println("HelloWorld(fromabackgroundjob)");
returnStatus.OK_STATUS;
}
};
job.setPriority(Job.SHORT);
job.schedule();//startassoonaspossible
Job的默许优先级是Job.Long,这里例子中的优先级要比它高,只需挪用Job#schedule(),它就会尽快在别的的线程中运转run()中的代码。再看一个小例子:
finalJobjob=newJob("LongRunningJob"){
protectedIStatusrun(IProgressMonitormonitor){
try{
while(hasMoreWorkToDo()){
//dosomework
//...
if(monitor.isCanceled())returnStatus.CANCEL_STATUS;
}
returnStatus.OK_STATUS;
}finally{
schedule(60000);//startagaininanhour
}
}
};
job.addJobChangeListener(newJobChangeAdapter(){
publicvoiddone(IJobChangeEventevent){
if(event.getResult().isOK())
postMessage("Jobcompletedsuccessfully");
else
postError("Jobdidnotcompletesuccessfully");
}
});
job.setSystem(true);
job.schedule();//startassoonaspossible
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()办法。再看上面这个例子:
classTrivialJobextendsJob{
publicTrivialJob(){
super("TrivialJob");
}
publicIStatusrun(IProgressMonitormonitor){
System.out.println("Thisisajob");
returnStatus.OK_STATUS;
}
}
job的创立和企图以下所示:
TrivialJobjob=newTrivialJob();
System.out.println("Abouttoscheduleajob");
job.schedule();
System.out.println("Finishedschedulingajob");
他们的实行是和工夫不妨的,输入大概以下:
Abouttoscheduleajob
Thisisajob
Finishedschedulingajob
也多是:
Abouttoscheduleajob
Finishedschedulingajob
Thisisajob
假如但愿某个job运转完成后在持续时,可使用join()办法,join()会一向堵塞到该job运转完。
例子:
TrivialJobjob=newTrivialJob();
System.out.println("Abouttoscheduleajob");
job.schedule();
job.join();
if(job.getResult().isOk())
System.out.println("Jobcompletedwithsuccess");
else
System.out.println("Jobdidnotcompletesuccessfully");
下面的代码实行后,输入应当就是如许:
Abouttoscheduleajob
Thisisajob
Jobcompletedwithsuccess
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有关的事:
IProgressServiceprogressService=PlatformUI.getWorkbench().getProgressService();
progressService.busyCursorWhile(newIRunnableWithProgress(){
publicvoidrun(IProgressMonitormonitor){
//donon-UIwork
}
});
效果:
2)IProgressService#runInUI的用法则子:
注重这里的run()中能够做些和UI有关的事。
progressService.runInUI(
PlatformUI.getWorkbench().getProgressService(),
newIRunnableWithProgress(){
publicvoidrun(IProgressMonitormonitor){
//doUIwork
}
},
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);就能够了.
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) |
|