2009-02-01 30 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

相關問題