JFace進度條使用經驗一則
我討論的進度條主要是JFace的進度條,RCP已經提供了完善的Job組件,為什么還要用JFace的進度條呢?原因是我要在登陸界面上做進度處理,也就是使用Eclipse3.3提供的AbstractSplashHandler特性,可以將原有的啟動畫面替換成為一個登陸界面,啟動這個登陸界面時,Eclipse的Platform此時還沒有啟動,所以不能使用RCP本身的Job組件了。
由于是一個檢測服務器是否聯通的測試,所以并不知道測試的真實時間,所以就是要使用“傻瓜進度條”了,也就是反復走的進度條陳剛的代碼如下:
button.addSelectionListener(new SelectionAdapter() { private void go() { public void widgetSelected(SelectionEvent e) { private void showProgressDialog() { |
主要是使用兩個線程交替使用,第一個線程處理業務,第二個線程監控第一個線程查看它是否結束,如果結束或者被點擊cancele則停止進度條的進程,如果一直沒有關閉的指令,則反復開始---累加---結束---開始---累加---結束。
我們幾乎是把陳剛的代碼原原本本的抄襲了一下,僅僅是替換了go()中的內容,但是發現一個問題
new ProgressMonitorDialog(s).run(true, true, runnable);
使用此句的話,JFace的線程永遠不會啟動;
替換為
new ProgressMonitorDialog(s).run(false, true, runnable);
使用此句的話,JFace的線程可以啟動,運行正常,但是cancele不能響應,UI界面完全卡死!
第一個參數的名字fork~乍看去,什么意思都沒有,但是看看API才發現內藏很大的玄機,如果為true則此線程為一個非UI線程,大家知道非UI線程是不會阻塞UI的;如果為false則此線程為一個UI線程,大家也知道UI線程如果使用不當很容易阻塞UI的。
關鍵的問題是我們和陳剛的代碼幾乎一摸一樣他的進度條就啟動,我的進度條就不啟動!為什么?(這點至今不明白!)
詳查API發現如果fork為false的時候還是另有洞天的:
This implementation of IRunnableContext#run(boolean, boolean, IRunnableWithProgress) runs the given |
API中說的很明白,如果fork為false時需要在線程中調用Display.readAndDispatch()方法,以避免UI被阻塞!
大家如果在JFace的開發中如果使用了進度條,發現UI被阻塞的話,就想想我哦!!!呵呵只用在進程中調用一下Display.readAndDispatch()就解決了!
客戶虐我千百遍,我待客戶如初戀!
posted on 2008-02-29 08:47 阿南 閱讀(3825) 評論(6) 編輯 收藏 所屬分類: Eclipse-SWT 、個人原創