Как мне обработать только самое новое сообщение в очереди erlang?

Я пишу игровой движок в Эрланге, где сервер постоянно отправляет новые позиции клиенту. Я хочу просто использовать последнее сообщение и выбросить все остальное, есть ли способ, которым я могу это сделать? Я использую Jinterface на стороне клиента, поэтому решение для этого было бы неплохо.

1 ответ

Решение

В эрланге невозможно (напрямую) делать то, что вы говорите. Но вы можете использовать промежуточный сервер для достижения этого поведения. роль этого сервера будет заключаться в получении всех сообщений и хранении копии последнего сообщения, а также в ответ на запрос клиента, отправив это сообщение.

-module(latest).

-compile([export_all]).


start() ->
    P = spawn(fun() -> loop(empty) end),
    register(?MODULE,P).

loop(Last) ->
    receive
        {newpos,X} -> loop(X);
        {getpos,Pid} -> Pid ! Last, loop(empty);
        stop -> stopped
    end.
% interfaces

storepos(X) -> ?MODULE ! {newpos,X}.

getpos() -> 
    ?MODULE ! {getpos,self()},
    receive
        M -> M
    end.

stop() -> ?MODULE ! stop.

% test func

test() ->
    start(),
    P1 = spawn(fun() -> posloop(0) end),
    P2 = spawn(fun() -> clientloop() end),
    {P1,P2}.

endtest({P1,P2}) ->
    exit(P1,kill),
    exit(P2,kill),
    stop().

posloop(I) ->
    storepos(I),
    timer:sleep(random:uniform(50)),
    posloop(I+1).

clientloop() ->
    io:format("position at ~p is ~p~n",[erlang:now(),getpos()]),
    timer:sleep(random:uniform(200)),
    clientloop().

результат испытаний:

1> A = latest:test().
position at {1399,377773,874000} is 0
{<0.64.0>,<0.65.0>}
position at {1399,377773,967000} is 2
position at {1399,377774,124000} is 6
position at {1399,377774,327000} is 12
position at {1399,377774,436000} is 17
position at {1399,377774,514000} is 19
position at {1399,377774,639000} is 24
position at {1399,377774,827000} is 30
position at {1399,377774,967000} is 34
position at {1399,377775,77000} is 38
position at {1399,377775,202000} is 42
position at {1399,377775,233000} is 43
position at {1399,377775,280000} is 44
position at {1399,377775,436000} is 47
position at {1399,377775,483000} is 48
position at {1399,377775,608000} is 52
position at {1399,377775,655000} is 54
position at {1399,377775,749000} is 57
position at {1399,377775,842000} is 60
position at {1399,377775,858000} is empty
position at {1399,377775,983000} is 63
position at {1399,377776,92000} is 66
position at {1399,377776,186000} is 69
2> latest:endtest(A).
stop
3> 
Другие вопросы по тегам