🤩

gen_statem コトハジメ

2021/10/14に公開

書きかけです

gen_statem は使ってるコード例が少ないので、せっかくなので解説していきます。

基本的にいかに書いてある事をただまとめただけなので、英語が読める人はこれを読む必要は無いです。

state_enter

callback_mode に [state_functions, state_enter] のように指定できます。

state_enter を指定すると StateName(enter, OldState, _) -> が使えるようになり、
next_state で切り替えたタイミングで、呼ばれる関数が書けるようになります。

タイマー

gen_statem には 4 つのタイマーが存在します。

  • {timeout, Timeout, EventContent}
  • {state_timeout, Timeout, EventContent}
  • {{timeout, Name}, Timeout, EventContent}
  • erlang:start_timer/3

timeout

イベントタイムアウトはイベントが発火すると自動でキャンセルされます。
何かアクションが来ないと発火する仕組みに利用できます。

state_timeout

ステートタイムアウトは状態が切り替わった場合に自動でキャンセルされます。
状態を切り替えるか、アクションで {state_timeout, cancel} を指定しない限りはキャンセルすることはされません。

{timeout, Name}

汎用タイムアウトは状態が切り替わった場合でも自動でキャンセルされません。
キャンセルするには {{timeout, Name}, cancel} を呼ぶ必要があります。

erlang:start_timer/3

知らない人はいないと思うので省略します。

gen_event では (info, {timeout, TRef, Msg}, ... で受け取れます。

リスタート、キャンセル、アップデート

state_timeout と {timeout, Name} はリスタート、キャンセル、アップデートが存在します。

リスタートは同じアクションを指定するだけで、利用可能です。過去のタイムアウトをキャンセルしてスタートしてくれます。

キャンセルは前述したとおりです。

アップデートは EventContent を上書きすることができます。 {state_timeout, udpate, spam} とするだけです。

Discussion