我有一个关于gen_fsm超时的问题。假设您有一组具有两种状态(将来可能更多)的gen_fsm:idle (开始状态)和working。
每隔5秒,gen_fsm就会检查一个特定的参数,并根据它保留在idle中或移到working中。每当gen_fsm移动到working时,它都会向所有其他gen_fsm发送一条消息(使用gen_fsm:send_all_state_event/2):idle中的应该移动到working,而working中的应该不关心传入的消息。
现在,重点是我不想在超时状态中出现偏差(例如,如果机器在working中持续3秒并接收到一条消息,会发生什么?5秒的超时不再有效,因为我无论如何都想保留一个固定的超时(这意味着超时消息应该在固定的时间触发)。
下面是我的解决方案的重要部分,它使用now()和time:now_diff/2。我有一个小的漂移,但似乎是公平的,因为谈到几分秒。
你认为它是有效的吗?
{ok, idle, #state{time = now()}, 5000}.
idle(timeout, State) ->
%% do some operations
{next_state, idle, State#state{time = now()}, 5000}.
working(timeout, State) ->
%% do some other actions
{next_state, working, State#state{time = now()}, 5000}.
handle_event(work, working, #state{time = Time} = State) ->
Timeout = round(timer:now_diff(now(), Time) / 1000),
{next_state, working, State, Timeout}.
handle_event(work, StateName, state{time = Time} = State) ->
Timeout = round(timer:now_diff(now(), Time) / 1000),
{next_state, working, State, Timeout}.发布于 2012-03-05 21:33:41
您可以使用任一timer:apply_interval来调用将事件发送到fsm的api函数。
或者使用timer:send_interval发送可在gen_fsm的handle_info回调中处理的自定义消息。
https://stackoverflow.com/questions/9565841
复制相似问题