首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gen_fsm erlang超时

gen_fsm erlang超时
EN

Stack Overflow用户
提问于 2012-03-05 19:27:29
回答 1查看 884关注 0票数 1

我有一个关于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。我有一个小的漂移,但似乎是公平的,因为谈到几分秒。

你认为它是有效的吗?

代码语言:javascript
复制
{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}.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-05 21:33:41

您可以使用任一timer:apply_interval来调用将事件发送到fsm的api函数。

或者使用timer:send_interval发送可在gen_fsm的handle_info回调中处理的自定义消息。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9565841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档