2009-02-01 85 views
2

我创建了一个导致生成gen_server的管理器,我叫timer_server。这个timer_server的任务之一是管理注册并呼叫timer:send_interval以特定的时间间隔向pid发送消息。gen_server名为timer_server导致定时器模块函数不返回

但是,在gen_server的init中,我调用timer:send_interval时,我正在锁定。文档说定时器:函数立即返回,所以这非常麻烦。

当我将我的gen_server更名为record_timer_server时,此问题被清除。我的问题是双重的,那么:

  1. 我为什么不能创造一个注册过程timer_server,如果已经有了一个当timer:start()是由我的应用程序启动时叫什么名字?
  2. 一旦开始,如果使用send_interval函数调用我的timer_server,为什么该函数不会导致找不到匹配的名称?

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

回答

3

这可以通过执行以下挂起对定时器的调用:send_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_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. 

返回罚款,随后gen_server:打电话timer_server。你的过程会陷入等待自己回应的状态。

+0

谢谢,这是完全合理的。 – 2009-02-01 17:58:03