Версия, приведенная ниже, работает так, как вы ожидаете - по крайней мере, я так думаю, потому что нет ни большого количества комментариев ни в вашем вопросе, ни в вашем коде.
она содержит 2 модификации:
- Как сказал Odobenus, если вы вызываете функцию inp, функция user2 немедленно получает возвращаемое значение spawn, которое является pid порожденного процесса, а не строку, введенную пользователем.Таким образом, user2 больше ничего не ждет.Процесс все еще существует, поэтому он предложит "entry:", дождется ввода, но не будет его использовать, и строка будет потеряна при вводе.
- В последний раз возникла другая проблемастрока, когда вы вызываете функцию user2.Опять же, функция запуска немедленно останавливается, когда она получает pid нового процесса;поскольку он был запущен командой оболочки, оболочка сразу же получает контроль над io, и процесс user2 никогда не получит строку, введенную пользователем, поскольку она будет интерпретироваться оболочкой как команда.
'' '
-module(third).
-export([start/0,user2/4,user1/2,inp/1]).
inp(P) ->
S = io:get_line("entry: \n"),
P ! S.
user2(0, USERID1,_,_) ->
USERID1 ! bye,
io:format("finish");
user2(N, USERID1,Mess,K) ->
USERID1 ! {message, self(),Mess,K},
io:format("user2 wait for reply~n"),
receive
reply ->
S=self(),
inp(S)
end,
user2(N-1, USERID1,Mess,K+1).
user1(Mess,K) ->
receive
bye ->
io:format("conversation over");
{message, USERID2,Mess,K} ->
io:format("~p~n",[lists:nth(K,Mess)]),
USERID2 ! reply,
user1(Mess,K+1)
end.
start() ->
Mess=["HEY","sup","how are you","yhank you","bye"],
USERID1=spawn(third, user1, [Mess,1]),
user2(5,USERID1,Mess,1).
' ''
Однако в вашем примере два пользовательских процесса на самом деле не связываются: они не проверяют сообщения и обмениваются каждый разполная коллекция сообщений.Я предлагаю вам изучить эту другую версию, по умолчанию, после 5 обменов, пользователь 1 закрывает чат, но пользователь 2 может остановить его раньше, введя сообщение "пока".
'' '
-module(third).
-export([start/0,user2/1,user1/1]).
user2(USERID1) ->
S = io:get_line("entry: \n"),
USERID1 ! {message, self(),S},
io:format("user2 wait for reply~n"),
maybe_continue_user2(USERID1,S).
maybe_continue_user2(_,"bye\n") ->
io:format("User2 ends the chat~n");
maybe_continue_user2(USERID1,_) ->
receive
{reply,"bye"} ->
io:format("bye, close chat~n");
{reply,Mess} ->
io:format("user2 got ~p~n",[Mess]),
user2(USERID1)
end.
user1([]) ->
io:format("User1 ends the chat~n");
user1([H|T]) ->
receive
{message,_,"bye\n"} ->
io:format("user 1: conversation over~n");
{message, USERID2,Mess} ->
io:format("~p~n",[Mess]),
USERID2 ! {reply,H},
user1(T)
end.
start() ->
Mess=["HEY","sup","how are you","thank you","bye"],
USERID1=spawn(third, user1, [Mess]),
user2(USERID1).
'' '
пример, когда пользователь 2 останавливает чат:
9> third:start().
entry:
hi
user2 wait for reply
"hi\n"
user2 got "HEY"
entry:
how are you?
user2 wait for reply
"how are you?\n"
user2 got "sup"
entry:
bye
user2 wait for reply
user 1: conversation over
User2 ends the chat
ok
10>