FORTUNE

          THE WAY TO THE MASTER...
          posts - 49, comments - 18, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          SWT多線程問題

          Posted on 2006-02-21 17:01 fortune 閱讀(1086) 評論(0)  編輯  收藏 所屬分類: java技術(shù)
          多線程問題:SWT使用Display類來維護(hù)GUI及其使用的系統(tǒng)資源。它禁止用戶在其他線程下訪問GUI資源。例如:

          public void run() {
                  butt.setText("test");
              }
          這樣的寫法會導(dǎo)致非法線程異常。如果需要在其他線程下訪問GUI資源可以使用如下方法:
          Display.getCurrent().asyncExec(new Thread () {
              public void run() {
                     butt.setText("test");
              }
          })

          •          Display提供同步異步方法分別是: syncExec(Runnable)asyncExec(Runnable)
          •          對于Display,在同一個線程里,不能申明2Display實例。同樣的,一個Display實例也不能跨線程使用。也就是說,如果你要在另外一個線程中顯示一個窗體,你必須另外創(chuàng)建一個Display實例。不然會導(dǎo)致異常。)

          線程問題

            在任何操作平臺的GUI系統(tǒng)中,對構(gòu)件或一些圖形API的訪問操作都要被嚴(yán)格同步并串行化。例如,在一個圖形界面中的按鍵構(gòu)件可被設(shè)成可用狀態(tài)(enable)或禁用狀態(tài)(disable),正常的處理方式是,用戶對按鍵狀態(tài)設(shè)置操作都要被放入到GUI系統(tǒng)的事件處理隊列中(這意味著訪問操作被串行化),然后依次處理(這意味著訪問操作被同步)。想象當(dāng)按鍵可用狀態(tài)的設(shè)置函數(shù)還沒有執(zhí)行結(jié)束的時候,程序就希望再設(shè)置該按鍵為禁用狀態(tài),勢必會引起沖突。實際上,這種操作在任何GUI系統(tǒng)都會觸發(fā)異常。

            Java語言本身就提供了多線程機(jī)制,這種機(jī)制對GUI編程來說是不利的,它不能保證圖形構(gòu)件操作的同步與串行化。SWT采用了一種簡單而直接的方式去適應(yīng)本地GUI系統(tǒng)對線程的要求:在SWT中,通常存在一個被稱為"用戶線程"的唯一線程,只有在這個線程中才能調(diào)用對構(gòu)件或某些圖形API的訪問操作。如果在非用戶線程中程序直接調(diào)用這些訪問操作,那么SWTExcepiton異常會被拋出。但是SWT也在*.widget.Display類中提供了兩個方法可以間接的在非用戶線程的進(jìn)行圖形構(gòu)件的訪問操作,這是通過的syncExec(Runnable)和asyncExec(Runnable)這兩個方法去實現(xiàn)的。例如:

          //此時程序運(yùn)行在一個非用戶線程中,并且希望在構(gòu)件panel上加入一個按鍵。

          Display.getCurrent().asyncExec(new Runnable() {
           public void run() {
            Button butt = new Button(panel,SWT.PUSH);
            butt.setText("Push");
           }
          });

            方法syncExec()和asyncExec()的區(qū)別在于前者要在指定的線程執(zhí)行結(jié)束后才返回,而后者則無論指定的線程是否執(zhí)行都會立即返回到當(dāng)前線程。

          主站蜘蛛池模板: 清新县| 洛川县| 赤水市| 博野县| 慈利县| 东乌珠穆沁旗| 开鲁县| 辰溪县| 岑巩县| 虎林市| 高青县| 岳阳市| 吴桥县| 东海县| 梁平县| 遂宁市| 绵竹市| 威远县| 黄梅县| 上饶市| 繁昌县| 搜索| 轮台县| 中宁县| 黄梅县| 河西区| 堆龙德庆县| 通山县| 虹口区| 威信县| 长宁区| 开平市| 磴口县| 邓州市| 萨嘎县| 青河县| 铁力市| 建瓯市| 浦县| 靖远县| 青阳县|