U⁄A LABO

RSS

SEARCH

AUTHOR

  • Naoki Muramatsu (1件) Twitter:@Stryfy.

  • deco-dekai (1件) ビートダウンパートでご飯何杯も食べられます。
    ハードコア・テクニカルディレクターを目指して日々精進。

  • yanbou (6件) 犬と猫で、家が毎日運動会のフラッシュデベロッパー。
    ビールから発泡酒へ変更で節約中。

  • chikatherrsix (8件) メタル界のフラッシュデベロッパー。またある時はメタルギタリスト。オーサリング中もヘッドバンギングは絶やさない。

  • akuze (2件) 2003年からユナイティアに寄生しているフラッシュデベロッパー。
    シルクドソレイユとカナダが好き。

  • knockknock (16件) 小遣い2万円のフラッシュデベロッパー。
    帰りが遅いのにキレる嫁をだましだまし制作中・・・。

  • takaiw (18件) フラッシュデベロッパー。遊びでゲームを作るのも好きです。外見に似合わないイラストを描くのも好きです。とにかく作るのが好きです。

CATEGORY

HOME  >  ThreadLibraryを使ってみた。

2011.09.30 Kikuchi

ThreadLibraryを使ってみた。

初めまして。初投稿となります。Kikuchiです。

まだまだ新米ですが。頑張っていきたいと思います。

で、今回はActionScript3のライブラリで、Spark projectさんの公開している
ThreadLibrary1.0を使ってみました。
ThreadLibrary1.0

そもそもどんなライブラリなのかというと、
Threadというものが元々同期的な物で、AS3でできるだけイベントのことを考えないで同期的にコードが書けるよ!ってライブラリのようです。
元々Javaを勉強していた身としてはThreadと聞いて早々に飛びついてしまいました。

売りに「イベントリスナーにさようなら」とあるので一先ずイベントを一切使わずに
画像をロードして表示する簡単なFlashを作ってみよう。と言うことで作ってみました。

まずは、ドキュメントクラスでThreadの初期化をします。
引数ですが、EnterFrameThreadExecuterとIntervalThreadExecuterがありまして
名前の通り、フレーム実行か、指定間隔でスレッドを実行するというものです。

Thread.initialize(new EnterFrameThreadExecutor());

メインのThreadクラスです。 Threadをextendsして、runというfunctionをオーバーライドします。 ここらへんもJavaを真似てますね。 runが実行関数になるのですが、基本的に直接呼ぶことはありません。

public class MainThread extends Thread {
  private var _threadFirst:ChildThread = new ChildThread();
  private var _image:Bitmap;
  private var _displayContainer:DisplayObjectContainer;

  public function MainThread(container:DisplayObjectContainer) {
   _displayContainer = container;
  }
  override protected function run():void {
   _threadFirst.start();
   _threadFirst.join();
  }
  override protected function finalize():void {
   _image = _threadFirst.getImage();
   _displayContainer.addChild(_image);
   
  }
}
ついでにfinalizeもオーバーライドしておきます。終了処理ですね。

ここでThreadのキモとなるfunctionですが、

sleep();
join();
start();
next();
があります。
start()は名前の通り実行開始。runを実行します。
join()はちょっとややこしいのですが、join()を呼び出したThreadをjoin()が呼び出されたThreadが終了するのを待つ。
という物です。これがあればCOMPLETEをとったりdispatchしなくてすみますね!
sleep()は名前の通り引数に指定した秒数呼び出されたThreadの実行を待機させます。タイマーいらずですね!
next()は引数にfunctionを取って次にそのメソッドを実行します。next(run)でループできます。これも何かと便利。

おまけにThreadStateなんていうクラスもあって、その時その時のThreadの状態が参照できます。

次に子クラスです。

public class ChildThread extends Thread 
{
  private var _loader:LoaderThread = new LoaderThread(new URLRequest("image.png"));
  private var _image:Bitmap;
  override protected function run():void {
   _loader.start();
   _loader.join();
   next(_execute);
  }
  private function _execute():void {
   _image = Bitmap(_loader.loader.content);
  }
  override protected function finalize():void {
  }
  public function getImage():Bitmap {
   return _image;
  }
}
Threadクラスの中でThreadクラスを実行している場合、先に子スレッドが実行されます。
現在 MainThread→ChildThred→MainThredと実行されているわけですね。
先に子スレッドが実行されるとはいえ、当たり前ですがrunメソッド自体は最後まで実行されますので、
nextに指定したfunctionかfinalizeにjoin解除後の処理を書く感じです。
LoaderThreadクラスはThread機能の追加されたLoaderですね。

こんな所でしょうか。
簡単なソースな上に完成品は画像が張り付いているだけなので割愛します。

何故か結構長くなってしまいました・・・。

ではまた!

CATEGORY