轉載地址: }
});
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
Finished 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=/or...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.....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=/or...c.isv/guide/workbench_jobs.htm
另外,有少數時候,我們不想彈出一個進度條窗口,而是只在最底下的狀態欄顯示就可以了,很簡單,寫自己的Job類時,在構造方法里加上一句:
setUser(false);就可以了.
});
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
Finished 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=/or...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.....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=/or...c.isv/guide/workbench_jobs.htm
另外,有少數時候,我們不想彈出一個進度條窗口,而是只在最底下的狀態欄顯示就可以了,很簡單,寫自己的Job類時,在構造方法里加上一句:
setUser(false);就可以了.