Завершить gen_fsm, если событие не пришло

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

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

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

С уважением

Matt

1 ответ

Решение

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

Другие вопросы по тегам