やっと「そうめん」触ったよ(5) -スレッド間連携(スレッドの基本構造)-
2008/10/28 21:02 - AS3.0
前回は、スレッドが外部からオブジェクトを受け取りたい場合、メンバプロパティとコンストラクタのコンボを使うんだ、ということをみました。
ではその逆にスレッド内で生成したオブジェクトを外部へ引き渡す場合どうするのかを考えてみましょう。
まずはスレッドクラスの構造を確認します。
スレッドには run() メソッドが必須です。 スレッドは外部から start() を呼び出された時点でその処理が始まりますが、その起点となるメソッドが run() です。
run() から別なメソッドを呼び出す場合は next() メソッドを使います。 next() の引数は次に実行したい関数名。
run() の次に run2() を実行したい場合は以下のようなコードになります。
override protected function run():void { …… next(run2); } private function run2():void{ …… }
run2 から、さらに別なメソッドを呼び出したい場合も同様に next() を使います。
override protected function run():void { …… next(run2); } private function run2():void{ …… next(run3); } private function run3():void{ …… }
このように next() で次々に関数をつなぐことで処理がつながっていくわけですが、next() を指定しないと、そこで関数の連鎖を断ち切ることができます。 そして関数の連鎖を断ち切ったときがスレッドが終わるときです。
上記の例では run3() が終わったときがスレッドが終了するときですが、next() が呼ばれなかったときは暗黙的に finalize() というメソッドが呼び出されるということです。
この辺りは公式に懇切丁寧に書かれていることですね。
ところで run() にしても run() から連鎖するユーザ関数にしても、引数・返り値ともに持つことを許さない仕様っぽいです。
また run() から finalize() までは自動的に連続実行され、ユーザが介入する余地が、これまた、無い仕様っぽいです。
ということは、スレッドクラス内のメソッドから返り値を得るということが、通常のクラスメソッドのようにはおこなえないということですね。
ってことはスレッド内で生成したオブジェクト、外に持ち出せないじゃん。
まぁ作者さま的には、スレッドはそのスレッドだけで完結させましょう、という意図のもと斯様な設計となったものと推察します。 「スパゲティではなくそうめん」というコンセプトから考えるに、至極真っ当な仕様ですよね。
でもやっぱりボクちん的には、スレッド内で生成したオブジェクトを外に引き継ぎたいのです。 で思いついた解決策は…… 次回に続く。