代码之家  ›  专栏  ›  技术社区  ›  Rob Elsner

名为timer\u server的gen\u服务器导致计时器模块功能不返回

  •  2
  • Rob Elsner  · 技术社区  · 17 年前

    gen_server 我打电话 timer_server . 这项研究的任务之一 timer_serve r是管理注册和呼叫 timer:send_interval 在特定时间间隔向pid发送消息。

    gen_服务器 定时器:发送间隔 我被关起来了。文档中说计时器:函数会立即返回,所以这非常麻烦。

    当我重新命名我的 gen_服务器 record_timer_server 这个问题解决了。那么,我的问题有两个:

    1. 为什么我可以创建一个注册的进程 定时器服务器 timer:start() 我的应用程序启动时调用了?
    2. 一旦启动,如果该函数正在调用我的 定时器服务器 使用 send_interval 作用

    我不认为代码是必要的,但如果需要,我可以更新以添加一些代码。

    1 回复  |  直到 17 年前
        1
  •  3
  •   cthulahoops    17 年前

    只需执行以下挂起对计时器的调用即可重新创建:send\u interval。

    1> register(timer_server, self()).
    true
    2> timer:send_interval(5000, self(), hello).
    

    虽然这失败了。。。

    1> timer:send_interval(5000, self(), hello).
    {ok,{interval,#Ref<0.0.0.32>}}
    2> register(timer_server, self()).
    ** exited: {badarg,[{erlang,register,[timer_server,<0.30.0>]},
    

    因此,第一次调用timer似乎试图启动一个名为timer_server的进程,如果您先使用了这个名称,它就会挂起。

    至于为什么挂起timer.erl:

    ensure_started() ->
        case whereis(timer_server) of
            undefined -> 
                C = {timer_server, {?MODULE, start_link, []}, permanent, 1000, 
                    worker, [?MODULE]}
                supervisor:start_child(kernel_safe_sup, C),  % kernel_safe_sup
                ok;
            _ -> ok
        end.
    

    返回fine,然后是gen_服务器:调用timer_服务器。然后,您的流程就会陷入等待自己响应的状态。