2016-07-14 4 views
1

У меня есть gen_server, который увеличивает счетчик каждый раз, когда вызывается функция increment().Как передать параметр функции 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({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)). 

Обратите внимание, что ваша handle_call функция Безразлично 't возвращает тип значения, ожидаемый поведением gen_server, поэтому этот процесс, скорее всего, сбой после каждого запроса. Вы должны добавить что-то вроде этой последней строки:

{reply, ok, File}. 
+0

Вы мне очень помогли, спасибо! –

Смежные вопросы