シーケンシャルに処理しようとすると、Adobe AS3 はなかなかきついな[AIR/Flex]
(2011-01-24 17:56:01) by shinoda


WebService と通信しながら、シーケンシャルに処理したい案件があったので、

1.プロセス順(ProcIdx)に 0 をセットして、最初の WebService との通信用イベントを実行し、ProcIdx の値が更新されるまで無限ループで待つ。
(例)
ProcIdxOld  = ProcIdx;
while(ProcIdx <= ProcIdxOld) {
    // dummy
}

2.WebService との通信用イベントが終了(ResultEvent.RESULT 等)したら、ProcIdx の値を 1加算。

3.上記 2の処理で ProcIdx の値が加算されたので、1 の処理の while ループから抜けて次の処理へ・・・

という動きでシーケンシャルな処理を実現しようと思ったのだが・・・

駄目だった(^^;

どうも、1の while ループ処理が CPU を掴みっぱなしになってしまうようで、終了イベント(上記 2の処理ね)がまったく実行されないようだ。

ここで、VisualBasic なら sleep 命令を while ループの中に書いて終わりなのだが、Adobe ActionScript には sleep 命令はない。

つーことで、結局、Timer イベントを 500ミリ秒とかの単位で発生させ、

1.Timer イベントで、現在どこまで処理が進んでいるかチェック(プロセス番号(ProcIdx)や、そのプロセスが終了したかのフラグ(ProxEndFlg)を持ち、その値をチェックする)。前の処理が終わったら、次の処理をおこなう(WebService との通信用イベントを実行)。その際、ProcIdx を 1加算。

2.WebServer との通信用イベントが終了(ResultEvent.RESULT 等)したら、ProcEndFlg に 1(終了の意味)をセット。

3.Timer イベントで、現在どこまで処理が進んでいるかチェック。前の処理が終わったら、次の処理をおこなう(WebService との通信用イベントを実行)。その際、ProcIdx を 1加算。

・・・これが、全ての WebService との通信処理が終わるまで延々続く・・・

というプログラムを書かなきゃ駄目。
Timer イベント内で、処理がどこまで進んでいるかチェックする分だけプログラムは複雑になる。

まあ、sleep が無いのはイベント駆動型プログラミングとしては正当なのかもしれないが、やっぱ sleep あると便利だなあという思いは捨てきれない、お茶目で巨根な俺なのである。

ああ・・・面倒くせえ。(^^;


コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8