今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

タイマーめんどい via ほその日記

どうやってタイマーとビューを関連付けようかと思って、適当に書いたら

タイマーはシステム内にあるアクター的なエンティティだと思うことにしている。
ビューとモデルの関連付けは、Observerパターンを使う。ビューはモデルの状態変化をイベントとして受け取るリスナーにしておく。
で、タイマーというアクターがモデルに対して作用することでモデルの状態が変化する(ことがある)。モデルの状態が変化したときにイベントが発生させ、Observerであるビューに対して変化が通知する。あとはビューをモデルの状態に合わせて更新すればよい。あたりまえだけど、モデルがビューに依存してはいけない。
SWTだとどうすりゃいいんか知らんけど、Swingの場合はSwingUtilities#invokeLater()メソッドを使ってAWTEventDispatchThreadに制御を引き渡す。
ところで、

org.eclipse.swt.SWTException: Invalid thread access

って、どういう理由で発生するの? SwingにおけるSingle Thread Ruleみたいなのが、SWTにもあるのかしら?
Swingは、SwingコンポーネントにアクセスしているスレッドがAWTEventDispatchThreadかどうかなんてチェックはしてくれない。無条件で実行してくれる。おかげで、きちんとコードを書いておかないとタイミングによってはデッドロックするのよね。