gen_server라는 이름의 Timer_Server가 타이머 모듈 기능이 반환되지 않도록했습니다.
문제
나는 a gen_server
나는 전화했다 timer_server
. 이것의 작업 중 하나입니다 timer_serve
R은 등록 및 전화를 관리하는 것입니다 timer:send_interval
특정 간격으로 PID에 메시지를 보냅니다.
그러나, 초기에 gen_server
, 내가 전화하는 곳 timer:send_interval
나는 잠금을 받고 있었다. 문서는 타이머 : 기능이 즉시 돌아 오기 때문에 매우 문제가되었습니다.
내가 이름을 바꿀 때 gen_server
에게 record_timer_server
이 문제가 해결되었습니다. 내 질문은 두 배입니다.
- 등록 된 프로세스를 만들 수있는 이유는 무엇입니까?
timer_server
, 이미 하나가 있다면timer:start()
내 응용 프로그램에서 시작하여 호출 되었습니까? - 일단 시작되면이 기능이 이름을 찾는 데 오용이 발생하지 않는 이유는 무엇입니까?
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로 전화합니다. 그러면 당신의 과정이 스스로 응답하기를 기다리게됩니다.
제휴하지 않습니다 StackOverflow