「そうめん」で作る「情報視覚化」(3)
2009/02/24 20:34 - AS3.0
「ビジュアライジング・データ」第3章に触発されて作った都道府県の面積を表示する日本地図の各ソース説明の続き。
クラス(2) 「そうめん」に関係するクラス
- Main.as (ドキュメントクラス)
- MainTread.as (主スレッドクラス)
- DotThread.as (表示する円を司るスレッドクラス)
- Tablize.as (csv を表にするクラス)
- DataManager.as (各種データを管理するクラス)
今回は上記5クラスのうち、Thread のサブクラスである MainThread と DotThread について。
MainThread.as
MainThread は以下の流れでメソッド分割しています。
- 開始待ち
- データ表示用のテキストフィールド生成
- csv の読み込み
- csv のテーブル化
- テーブルの解析・マージ、DataManager・表示物(DotThread)の生成
MainThread は見たとおり特段の問題はないです。 一つだけ気をつけなくてはならない点は、最後に DotThread を作るところ。 ParallelExecutor を使っていますが、SerialExecutor はダメ。
なんで SerialExecutor じゃダメなのかというのは DotThread の説明で明らかになります。
DotThread.as
このスレッドは何をしているのか。
まず何はなくとも表示物である円を作ります。Sprite を生成し graphics で円を描画。
次に、その円 Sprite の座標およびスケールをメディエイタである DataManager から取得します。
最後に TweenThread で表示をおこないます。
と、ここまでが run メソッド。
あと、マウスイベント管理部門があります。 次の3者で成り立っています。
- addMouseEvent
- rollOverHandler
- rollOutHandler
addMouseEvent メソッドでは、event メソッドによりロールオーバー時のイベント追加をおこないます。 イベントハンドラは rollOverHandler。
rollOverHandler では dataManager への表示依頼と、event メソッドによりロールアウト時のイベント追加をおこないます。 イベントハンドラは rollOutHandler。
rollOutHandler では dataManager への表示消去依頼と、addMouseEvent メソッドへの回帰をおこないます。
つまりこのスレッドは最後に無限ループが発生しているわけです。
┌──→──┐ │ ↓ │ addMouseEvent │ ↓ ↑ rollOverHandler │ ↓ │ rollOutHandler │ ↓ └──←──┘
これが、MainThread において SerialExecutor を使って DotThread を生成してはダメな理由です。
SerialExecutor は1個ずつ順番にスレッドを生成します。1個ずつ順番にというのは1番目のスレッドが完了したら2番目、2番目のスレッドが完了したら3番目…… ということですが、DotThread は無限ループなのでスレッドの完了がありません。
つまり SerialExecutor を使うと、1個ドットを表示しただけで止まってしまうと、まあそういうことです。
ところで、このシリーズのはじめでもちょこっと述べましたが、Dot は別にスレッドにせんでもええやん、Dot は Sprite のサブクラスにしといて、マウスイベントは MainThread で処理すればええやん、という意見もあるでしょう、てゆーかワタクシはじめはそうしました。
ですがそれだと、ちょっと仕様的に後々困る側面になりそうな部分がありまして、だから Dot を Sprite のサブクラスではなく、わざわざ Thread のサブクラスにしたわけですが、次回はここら辺りの話を。