2009/05/29

SwingのEvent Dispatch ThreadとGriffonのedt

今更ながら、griffon登場後にswingの本やサイトを見ては勉強しています。

Swing EDT(Event Dispatch Thread)関係おさらい - Groove Tube

またEDTにやられる… - Groove Tube

Swingとスレッドと再描画 - Kazzzの日記

Event Dispatch Thread?

swingでボタン押下後の処理などを書きたい場合には、swing guiを管理しているスレッドとは別のスレッドを起動して実行する必要がある。

このguiを管理しているスレッドをEvent Dispatch Threadって呼ぶらしい。

このスレッド内で重たい処理を実行させると、処理完了までに

  • GUIのリサイズできない
  • GUIの移動できない
  • コントロールに入力したりフォーカス合わせたりできない

といったことになり、「Swingっていけてないじゃん、重たいじゃん」と勘違いしてしまう。つい最近そんなことをしてしまっていた。

別スレッドを生成して実行させても、その処理を実行後にまたEDTに成魚を戻して描画を行ったり・・・めんどいきがする。

griffonのedtメソッド、doOutsideメソッド

そこでgroovygriffonフレームワークが生きてくる。

コントローラクラス内では

  • edt
  • doOutsite

の二つのメソッドが使用できる。こいつらにクロージャーを渡すことで、edt、doOutsideブロック内に記述した処理はそれぞれEvent Dispatch Threadの処理、あるいは別スレッドの処理として実行させることができる。

 

def search = { event ->
    // ボタンを使用不可に
    model.searchEnbled = false
    
    // 別スレッド処理
    doOutside{
        // 検索処理
        // ...
    
        // ボタンを使用可能に
        edt{
            model.searchEnabled = true
        }
    }
}

最初griffonのサイトの説明読んだときにはさっぱりだったけど、swingについて勉強していってようやくわかってきた。

今更だけど少しずつswingの仕組みがわかってきた。

0 件のコメント:

コメントを投稿