<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 20, comments - 16, trackbacks - 0, articles - 0

    (轉(zhuǎn)載)RCP中異步線程的處理

    Posted on 2008-07-01 18:08 Raul Gong 閱讀(699) 評論(0)  編輯  收藏 所屬分類: eclipse

    轉(zhuǎn)載自:http://www.javaeye.com/topic/47919   感謝原作者

    在RCP中要在非UI線程中執(zhí)行UI線程的操作,最簡單的方式就是display.syncExec或者display.asyncExec,如果UI線程所需的時間較長的話,則應該使用display.asyncExec

    在執(zhí)行異步線程的時候,我們一般應當繼承Job或者UIJob類:UIJob是在UI線程中運行的,可以直接訪問窗體組件。Job是在非UI線程中運行,如果在里面想訪問窗體組件,需要通過Display.asynExec()或者synExec方式來執(zhí)行。UIJob要盡量的短,不要過多的占用UI線程的時間。

    在我現(xiàn)在的系統(tǒng)中,每當UI需要和Server交互的時候,都需要檢測
    Server是否啟動,如果未啟動的話,嘗試啟動三次,三次不成功則拋出Exception,用MessageDialog給用戶提示,啟動成功以后,還需載入相關信息。這樣的異步線程,就只能放到Job中執(zhí)行。

    然而,這樣還是遠遠不夠的,試想一下,如果點完一個MenuItem以后,過了很久才會有所反應,這種用戶體驗豈不是糟糕透了?于是我們還要提供進度條來提高用戶體驗度,在RCP中,就是如下的代碼:

    1. ProgressMonitorDialog progress = new ProgressMonitorDialog(null);  
    2. progress.setCancelable(true);  
    3. try {  
    4.     progress.run(truetruenew IRunnableWithProgress() {  
    5.         public void run(IProgressMonitor monitor)  
    6.                 throws InvocationTargetException {  
    7.             doSomething();  
    8.         }  
    9.     });  
    10. catch (InvocationTargetException e) {  
    11.     e.printStackTrace();  
    12. catch (InterruptedException e) {  
    13.   
    14. }  

    第二行中的
    progress.setCancelable(true)是為了允許客戶在長時間執(zhí)行后臺進程的時候,可以取消掉進程的執(zhí)行。這里我把實際的執(zhí)行過程Extract了出來,免得方法太長,doSomething()看起來應該是這樣子的:

    1. public void doSomething(IProgressMonitor monitor) {  
    2.         monitor.beginTask("Beginning...", IProgressMonitor.UNKNOWN);
    3.         monitor.subTask("Doing first job"); 
    4.         doFirstThing();
    5.         if(monitor.isCanceled()) return;
    6.         monitor.worked(1); 
    7.         monitor.subTask("Doing second job");
    8.         doSecondThing();
    9.         if(monitor.isCanceled()) return;
    10.         monitor.worked(2);
    11.         ...... 
    12.         monitor.done();  
    13.     }   
    14. }  

    這樣子當用戶點擊ProgressMonitor的Cancel按鈕時,
    monitor.isCanceled()就會返回true,doSomething便中止執(zhí)行。

    說到這里,可能就會有疑問了,monitor.isCanceled()方法只會在doFirstThing()和doSecondThing()之間才會被觸發(fā),那么如果doFirstThing()的過程中有異常情況而導致無法返回,那點擊Cancel就根本沒有作用啊?

    唔......這個就是問題的核心所在了,我不知道別人是如何解決的,在這里我只說一下我的解決方案,希望能夠起到拋磚引玉的作用:

    在前面已經(jīng)提到,我使用了Job來處理異步線程,然而Job是通過調(diào)用job.schedule來執(zhí)行的,用戶無法確保job被執(zhí)行的時機以及何時結(jié)束,一般的方法是使用Listener,Observer或者某個信號量來指示Job的結(jié)束。在有些地方我用的是Observer模式,而在這種情況下,我用的是boolean變量來做指示。于是,上面的doSomething就變成了:

    1. public void doSomething(IProgressMonitor monitor) {  
    2.         monitor.beginTask("Beginning...", IProgressMonitor.UNKNOWN);
    3.         monitor.subTask("Doing first job"); 
    4.         job.schedule();
    5.         while (!jobFinished) {
    6.            if (monitor.isCanceled()) {
    7.               logger.info("monitor is canceled");
    8.               job.cancel();
    9.               return;
    10.            }
    11.            monitor.worked(times);
    12.            times++;
    13.         }
    14.         monitor.done();  
    15.     }   


    這樣,只要while循環(huán)沒有滿足結(jié)束條件,我們就可以通過點擊Cancel按鈕來cancel掉Job。如果job中還有些東西是無法自動cancel掉的話,比如Socket通信等,我們還可以在job.cancel()前面加上一些代碼來做這樣的工作,比如job.getSocket().close()等,當然還要處理好各種Exception。

    在Eclipse的Article里面,有幾篇分別講述Job和ProgressMonitor的文章,很是詳細,有興趣的朋友不妨找來看看。不過文章只是講解原理性的東西,開發(fā)中所碰到的問題,還是要靠個人的經(jīng)驗來分析解決......所以,還是多多coding,多多thinking,提高解決實際問題的能力吧:)


    ProgressMonitor的Article:

    http://www.eclipse.org/articles/Article-Progress-Monitors/article.html
    主站蜘蛛池模板: 老色鬼久久亚洲AV综合| 亚洲中文字幕无码久久2017| 亚洲a级成人片在线观看| 永久免费在线观看视频| 亚洲高清在线mv| 在线观看免费视频资源| 亚洲精品伊人久久久久| 最新欧洲大片免费在线| 亚洲欧美日韩中文二区| 国产jizzjizz视频免费看| 免费国产黄网站在线观看动图 | 色欲色香天天天综合网站免费| 亚洲国产二区三区久久| 亚洲视频免费在线播放| 亚洲自偷自偷在线成人网站传媒 | 日韩精品无码一区二区三区免费| 亚洲国产综合精品中文第一区 | 成人免费无码H在线观看不卡| 亚洲人成中文字幕在线观看| 一级毛片在线免费观看| 亚洲午夜福利在线视频| 久久精品亚洲男人的天堂| 日韩免费观看一区| 亚洲宅男精品一区在线观看| 免费在线观看亚洲| 日本视频在线观看永久免费| 国产精品亚洲自在线播放页码| 免费人成在线观看播放国产| 国产午夜无码精品免费看| 亚洲欧洲国产精品久久| 免费观看国产小粉嫩喷水| 国产免费爽爽视频在线观看| 国产99在线|亚洲| 成人午夜亚洲精品无码网站| 很黄很黄的网站免费的| 免费无码国产在线观国内自拍中文字幕| 欧洲亚洲国产清在高| 永久黄网站色视频免费| 大地资源中文在线观看免费版| 亚洲精品9999久久久久无码| 亚洲精品自在在线观看|