SWT Tips and Samples 基礎編 > スレッド

 

スレッド

別スレッドからUIの操作を行う場合、DisplayクラスのsyncExecあるいはasyncExecメソッドを使ってスレッドのインスタンスを与えてやる必要があります。これらのメソッドに与えられたスレッドは、Displayオブジェクト内部にストックされ、描画の都合のよりタイミングで実際に実行されます。UIの操作をsyncExecまたはasyncExec経由で実行しない場合、 org.eclipse.swt.SWTException: Invalid thread access の例外が発生するので、SWTのウィジェットの描画をバックグラウンドで実行する場合など、これらのメソッドを呼び出すことは必須です。

イディオムとしては、下に示すようにRunnableインタフェースを継承したクラスのオブジェクトをasyncExecメソッドに与えます。

public Thread1 implements Runnable{
   ...
   public void run(){
     //何らかの処理...
     display.asyncExec(new Runnable() {
         public void run() {
            ... 
            SWTウィジェットの処理
            ...
         }
     });
   }
}

以下のサンプルプログラムは、ボタンが押されるとプログレスバーが進行しますが、その描画を別スレッドで実行しています。

スクリーンショット

ソースコード

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;

public class ThreadTest {

        private Display display;
        private ProgressBar pb;
        private Button button;
        
        public static void main(String[] args) {
                new ThreadTest();
        }
        public ThreadTest() {
                display = new Display();
                Shell shell = new Shell(display);
                shell.setText("ThreadTest");
                shell.setLayout(new GridLayout(2, false));

                pb = new ProgressBar(shell, SWT.SMOOTH);
                pb.setMinimum(0);
                pb.setMaximum(100);

                button = new Button(shell, SWT.PUSH);
                button.setText("Press");
                button.addSelectionListener(new SelectionAdapter() {
                        public void widgetSelected(SelectionEvent e) {
                           //ボタンの重複押下を避けるため
                           button.setEnabled(false);
                              
                           //メインスレッドとは別のスレッドを生成
                           new Thread(new ProgressBarUpdater()).start();
                        }
                });

                shell.pack();
                shell.open();
                while (!shell.isDisposed()) {
                        if (!display.readAndDispatch()) {
                                display.sleep();
                        }
                }
                display.dispose();
        }

        class ProgressBarUpdater implements Runnable {
                private int index = 0;
                public void run() {
                        for (index = 0; index <= 100; index++) {
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException ex) {
                                        ex.printStackTrace();
                                }
                                display.asyncExec(new Runnable() {
                                        public void run() {
                                                pb.setSelection(index);
                                        }
                                });
                        }
                        
                        //処理が完了したらボタンを有効にする
                        display.asyncExec(new Runnable() {
                                public void run() {
                                        button.setEnabled(true);
                                }
                        });
                }
        }
}

参考書籍

  • Java言語で学ぶデザインパターン マルチスレッド編  結城 浩 (著)
    「Java言語で学ぶデザインパターン」の続編です。スレッドの仕組みについて図を用いて、非常に分かりやすく説明してある本です。前作についても言えることですが、それぞれのデザインパターンが直感的に理解できるよう、絶妙なたとえ話で解説がなされています。今回紹介したSWTのスレッドとは直接には関係ありませんが、一般的なスレッドの知識を理解するには非常にお勧めの本です。


最新更新日: 2004年9月1日
 
関連リンク
Eclipse API ドキュメント

- PR -

プレゼンテーション作成ソフト無料お試し版配信中

【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!

オフィス用品・オフィス家具 価 格 交 渉 可! 
◎ 目指せ★業界最安値 ★ ◎ オフィネット・ドットコム株式会社

注文から納品まで驚きの早さ!!【ASKULカタログ】はこちらから・・・

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送