2017-01-13 13 views
0

今Imはgen_servergen_server:呼び出し - 1が第二世代サーバーMOD、である - -

で遊んメッセージ私は2つのモジュールを持っているを送信するためにどのように論理モジュール

とPIDにメッセージを送信したいですgen_serverを通じて:ここ

を呼び出すコードのスニップです:

012:ここ

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

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

A及びロジックMODコード:

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)を取得しています。

{OK、cache_server}

3> C(論理)。

{OK、論理}

4> cache_server:開始([{TTL、15000}])。

{OK、< 0.73.0>}

5> cache_server:(テスト、根、15000)を挿入します。

{AUTH、テスト、根、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}


Iからデータを受信して​​い - {応答はPID {lookup_by_date、FromSec、ToSec}、_state!}。

けど「は、論理:lookup_by_date」からのデータを受信いけない機能

Imは少し立ち往生ので、あなたが私に正しい方向を示し、とにかくあります。 Thxを...あなたのコードで

答えて

2

は、gen_serverコールへの応答は次のとおりです。Erlangのメッセージで

Pid !{lookup_by_date, FromSec, ToSec} 

は非同期である、彼らは単にプロセスに送信されているので、このコードは待ちません。レスポンスを送信し、送信するメッセージをただちに返します。あなたが返信を受け取る理由は、{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

ああ。ご回答有難うございます。変更され、完全に今働いています。本当に役に立ちました。もう一度 – Qbeck

関連する問題