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