2009-02-01 3 views
2

나는 timer_server이라는 gen_server을 생성 한 관리자를 만들었습니다. 이 timer_serve의 작업 중 하나는 등록을 관리하고 timer:send_interval으로 전화하여 특정 간격으로 pid에 메시지를 보내도록하는 것입니다.timer_server라는 timer_server가 타이머 모듈 기능을 반환하지 못하게했습니다.

그러나 gen_server의 초기화에서는 timer:send_interval으로 전화를 걸어 왔습니다. 설명서에 따르면 타이머 : 기능이 즉각적으로 반환되므로 매우 어려웠습니다.

gen_server의 이름을 record_timer_server으로 바꿨을 때이 문제가 해결되었습니다. 내 질문이는 배입니다 : timer:start()이 시작 내 응용 프로그램에 의해 호출 될 때 이미이 있다면

  1. 가 왜, 등록 과정 timer_server을 만들 수 있을까?
  2. send_interval 함수를 사용하여 timer_server을 호출하는 경우이 함수가 시작되면 왜이 함수는 이름을 찾는 badmatch를 발생시키지 않습니까?

코드가 필요하다고 생각하지 않지만 요청시 일부 추가하도록 업데이트 할 수 있습니다.

답변

3

이것은 timer : 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

감사합니다. –