gen_server라는 이름의 Timer_Server가 타이머 모듈 기능이 반환되지 않도록했습니다.

StackOverflow https://stackoverflow.com/questions/500169

  •  20-08-2019
  •  | 
  •  

문제

나는 a gen_server 나는 전화했다 timer_server. 이것의 작업 중 하나입니다 timer_serveR은 등록 및 전화를 관리하는 것입니다 timer:send_interval 특정 간격으로 PID에 메시지를 보냅니다.

그러나, 초기에 gen_server, 내가 전화하는 곳 timer:send_interval 나는 잠금을 받고 있었다. 문서는 타이머 : 기능이 즉시 돌아 오기 때문에 매우 문제가되었습니다.

내가 이름을 바꿀 때 gen_server 에게 record_timer_server 이 문제가 해결되었습니다. 내 질문은 두 배입니다.

  1. 등록 된 프로세스를 만들 수있는 이유는 무엇입니까? timer_server, 이미 하나가 있다면 timer:start() 내 응용 프로그램에서 시작하여 호출 되었습니까?
  2. 일단 시작되면이 기능이 이름을 찾는 데 오용이 발생하지 않는 이유는 무엇입니까? timer_server 사용 send_interval 기능?

코드가 필요하다고 생각하지 않지만 요청하면 일부를 추가하기 위해 업데이트 할 수 있습니다.

도움이 되었습니까?

해결책

이것은 타이머에 대한 호출에 매달려있는 다음을 수행하여 간단히 재현 할 수 있습니다 : 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로 전화합니다. 그러면 당신의 과정이 스스로 응답하기를 기다리게됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top