2017-01-13 7 views
0

Im jetzt mit dem gen_server spielengen_server: call - wie Nachricht senden

Ich habe zwei Module - ist Gen Server mod, zweite - Logikmodul

und möchte die Nachricht an die PID senden durch die gen_server: call

hier die Schnipsel von Code ist:

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

hier ist die handle_call func:

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 die Logik mod Code:

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. 

aber ich erhalte den Fehler (eigentlich kein Fehler)

2> (cache_server).

{ok, cache_server}

3> C (Logik).

{ok, Logik}

4> cache_server: start ([{ttl, 15000}]).

{ok, < 0.73.0>}

5> cache_server: insert (Test, Wurzel, 15000).

{auth, test, Wurzel, 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}


Ich empfange Daten aus - {Antwort, Pid {lookup_by_date, FromSec, Tosec}, _STATE!};

aber die Daten nicht empfangen, die von der „Logik: lookup_by_date“ -Funktion

Gibt es irgendwie, das Sie mir in die richtige Richtung zeigen, weil Im ein wenig stecken. Thx ...

Antwort

2

In Ihrem Code, die Antwort auf die gen_server Anruf:

Pid !{lookup_by_date, FromSec, ToSec} 

In Erlang-Meldungen sind asynchron, sie sind nur an den Prozess gesendet, sodass dieser Code wartet nicht eine Antwort, und es gibt einfach die Nachricht, die Sie senden, sofort zurück. Deshalb erhalten Sie die Antwort {lookup_by_date, FromSec, ToSec}.

In Ihrem Fall müssen Sie keinen Prozess erzeugen, sondern einfach die lookup_by_date Funktion aufrufen:

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}; 

Hinweis: Ihr gen_server das Ergebnis nicht verwenden, wird sein Zustand nicht durch die Anforderung geändert , also könnten Sie direkt die Funktion lookup_by_date aufrufen und darin die Zeitkonvertierung einbeziehen.

+0

ahh. Danke für deine Antwort. geändert und es funktioniert jetzt perfekt. Wirklich hilfreich. Danke nochmal – Qbeck