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