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していて、動いているはずが止まってしまうということがおこりうる。気をつけよう。
コメント