2017-01-13 5 views
0

이제 필자가 gen_servergen_server : 전화 - 한 두 번째 세대 서버 모드입니다 - -

와 함께 연주 메시지 나는 두 개의 모듈을 보내는 방법을 로직 모듈

와 PID에 메시지를 보내려고 gen_server을 통해 :

012 : 여기
lookup_by_date(FromTime, ToTime) -> 
    gen_server:call({global, ?MODULE}, {lookup_by_date,FromTime,ToTime}). 

가 handle_call의 FUNC입니다 : 여기

코드의 싹둑입니다 전화 3,516,
handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) -> 
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime), 
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime), 
    Pid = spawn(fun()-> logic:handler() end), 
    {reply, Pid !{lookup_by_date, FromSec, ToSec}, _State}; 

aand가 논리 모드 코드 :

lookup_by_date(FromTime, ToTime) -> lookup_by_date(FromTime, ToTime, ets:first(auth), []). 
lookup_by_date(_FromTime, _ToTime, '$end_of_table', Acc) -> {reply, Acc, ok}; 
lookup_by_date(FromTime, ToTime, Key, Acc) -> 
    case ets:lookup(auth, Key) of 
     [{Login, Pass, TTL, Unix, Unix2}] -> 
      F = calendar:datetime_to_gregorian_seconds(Unix2), 
     T = calendar:datetime_to_gregorian_seconds(Unix2), 
     if 
      F >= FromTime, T =< ToTime -> NewAcc = [{Login, Pass, TTL, Unix, Unix2}|Acc], 
     N = ets:next(auth, Key), 
      lookup_by_date(FromTime, ToTime, N, NewAcc); 
     true -> N = ets:next(auth, Key), 
        lookup_by_date(FromTime, ToTime, N, Acc) 
     end 
     end. 

handler() -> 
    receive 
     {lookup_by_date, FromTime, ToTime}-> 
      lookup_by_date(FromTime, ToTime), 
      handler(); 
     Other-> 
     io:format("Error message for ~p~n" ,[Other]), 
     handler() 
    end. 

하지만 난 오류 (실제로는없는 오류)

2> C (cache_server)을 얻고있다.

{확인 cache_server}

3> C (로직).

{확인 로직}

4> cache_server 시작 ([{TTL 15000}]).

{확인, < 0.73.0>}

5> cache_server : 삽입 (테스트, 루트, 15000).

{인증, 테스트 루트 15000,1484309726435, 2017,1,13 {{}, {14,15,11}}}

6> cache_server : lookup_by_date ({{2017,1, 13}, {14, 15, 11}}, {{2017, 1, 13}, {14, 15, 11}})

{lookup_by_date, 63651536111,63651536111}


내가로부터 데이터를 수신하고 - {, 응답도 (Pid) {lookup_by_date, FromSec, ToSec}, _state!};

하지만이 "논리 : lookup_by_date"로부터 데이터를 수신하지 말아 기능

임 조금 붙어 있기 때문에 당신이 나에게 올바른 방향을 보여 어쨌든입니다. 들으 ... 당신의 코드에서

답변

2

의 gen_server 호출에 대한 응답은 다음과 같습니다 얼랑 메시지에서

Pid !{lookup_by_date, FromSec, ToSec} 

그들이 단지 프로세스에 전송, 비동기, 그래서이 코드는 기다리지 않습니다 응답을 보내고, 보내는 메시지를 immediatly로 반환합니다. 당신이 대답을 {lookup_by_date, FromSec, ToSec} 얻는 이유입니다.귀하의 경우에는

당신은 lookup_by_date 기능을 프로세스를 생성해야하지만, 단순히 호출하지 않습니다

handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) -> 
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime), 
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime), 
    {reply, logic:lookup_by_date(FromSec, ToSec), _State}; 

참고 : 결과를 사용하지 않습니다 gen_server가 그 상태가 요청에 의해 수정되지 않습니다 따라서 lookup_by_date 함수를 직접 호출하고 시간 변환을 포함시킬 수 있습니다.

+0

아. 당신의 대답에 감사드립니다. 변경 및 완벽하게 작동합니다. 정말 도움이. 다시 thx – Qbeck