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