Завершить gen_fsm, если событие не пришло - PullRequest
2 голосов
/ 15 ноября 2011

Я хочу, чтобы мой FSM завершал работу, если событие не наступает после определенного времени в каждом состоянии.

Я могу достичь такого сценария только в том случае, если после создания FSM нет события, указав значение времени ожидания в обратном вызове init, но я хотел бы, чтобы эта функция работала также для всех состояний.

Любое простое и быстрое решение?

С наилучшими пожеланиями

Мэтт

1 Ответ

1 голос
/ 16 ноября 2011

Вы можете установить таймаут в возвращаемом кортеже в каждом состоянии {next_state, NextStateName, NewStateData, Timeout}.См. gen_fsm документацию для получения более подробной информации.Но это работает только в том случае, если в gen_fsm нет входящих сообщений, так что это подходит, только если, например, вы хотите прервать процесс, когда, вероятно, никто не общается с ним.Если вам нужны жесткие ограничения (например, для протоколов), вы должны использовать erlang:send_after/3 или erlang:start_timer/3 и обрабатывать также прерывание по таймеру и т. Д.

...