« UJMLサンプル101:ステート変数の挙動を学ぶ→scriptブロックから外に出ないと次の処理はできない | メイン | UIE より公開されたスクリプト版コンパイラ、"Zipcode converter app"サンプルを試しましたか? »

UJMLサンプル102:ステート変数の挙動を学ぶ→もしかしたらはまってしまうかもしれない誤り(2006/04/20)

 無限ループでは割り込みできないことを前回紹介したが、それに対して<delay>を使うことで割り込み可能にする作り方を推奨している。

 以下は1000(msec)、つまり1秒おきに<script>が実行されるものだが、その肝は<script>中でsTickを一度falseにし、再度trueにセットしなおすことだ。これで、無限にsTickの<script>ブロック内の処理を実行することができる。
----
            <state var="sTick">
                <transition value="true">
                    <delay>1000</delay>
                    <script>
                        mI++;
                        sLabel = false;
                        sLabel = true;

                        sTick = false;
                        sTick = true;
                    </script>
                </transition>
            </state>
----

 ここで注意したいのは

sTick=true;

とした後、1000(msec)待ってから<script>を実行するということだ。

 UIEngineは<delay>で待っている状態、お休み状態ではイベントの割り込みを受けることができる。

 よって、1000(msec)の間にmIの値を増やしたり、0にする処理を割り込ませることも可能だ。例えばカウンターをボタン入力で初期化したいときには重宝する。

 これはステート変数にもあてはまる。1000(msec)の間にsTick=falseと割り込みすることで、待っていたsTickのscriptブロックの処理を中止することもできるのだ。

 実はここにはまりやすい。実は予期せぬところでsTick=falseしていて、動いているはずが止まってしまうということがおこりうる。気をつけよう。

Download 102_state.ujml

トラックバック

この記事のトラックバックURL:
https://www.typepad.com/services/trackback/6a00d8341c2e2e53ef00e5509476328833

UJMLサンプル102:ステート変数の挙動を学ぶ→もしかしたらはまってしまうかもしれない誤りを参照しているブログ:

コメント

この記事へのコメントは終了しました。