2016-07-14 7 views
1

increment()関数が呼び出されるたびにカウンタをインクリメントするgen_serverがあります。gen_server関数にパラメータを渡すには?

-module(genserver). 
-export([start_link/0, start/0, increment/0]). 
-behaviour(gen_server). 
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). 

init([]) -> 
    {ok, "counter.txt"}. 

start() -> 
    gen_server:start({local, ?MODULE}, ?MODULE, [], []). 

increment() -> 
    gen_server:call(?MODULE, increment). 

handle_call(increment, _From, File) -> 
    Counter = case file:read_file(File) of 
     {ok, Binary} -> binary_to_integer(Binary); 
     {error, enoent} -> 0 
    end, 
    ok = file:write_file(File, integer_to_binary(Counter + 1)). 

handle_cast(_Req, State) -> 
    {noreply, State}. 

handle_info(_Info, State) -> 
    {noreply, State}. 

terminate(_Reason, _State) -> 
    ok. 

code_change(_OldVsn, State, _Extra) -> 
    {ok, State}. 

は、ここでシェルが

Eshell V7.3 (abort with ^G) 
1> c("C:/Users/guga.melkadze/Desktop/testgen"). 
{ok,testgen} 
2> testgen:start(). 
{ok,<0.39.0>} 
3> testgen:increment(). 
920 
4> testgen:increment(). 
921 
5> testgen:increment(). 
922 

は今、私は一つのパラメータ私はgenserver:increment()メソッドを呼び出すたびに送信する必要がある例を実行しています。例えば、genserver:increment(someParameter)。これをどのように達成するのですか?

答えて

3

の変更だけではなく、原子のタプルを送信するためにincrement機能:

increment(N) -> 
    gen_server:call(?MODULE, {increment, N}). 

そして、それを使用するhandle_call句更新:あなたのhandle_call機能はdoesnのこと

handle_call({increment, N}, _From, File) -> 
    Counter = case file:read_file(File) of 
     {ok, Binary} -> binary_to_integer(Binary); 
     {error, enoent} -> 0 
    end, 
    ok = file:write_file(File, integer_to_binary(Counter + N)). 

注意をgen_serverの動作によって期待される値の型を返さないため、このプロセスは各要求後にクラッシュする可能性があります。最後の行に次のようなものを追加する必要があります。

{reply, ok, File}. 
+0

あなたは私に多くの助けをしました。 –

関連する問題