не пойму как работать с приостановкой процесса — не получается повторно запустить остановленный по suspend процесс.
вот код тестового модуля
-module(test).
p() ->
receive
{system, _From, resume} ->
sys:resume(self());
{system, _From, suspend} ->
sys:suspend(self());
{Msg} ->
io:format("received ~p~n",[Msg]),
p()
end.
запускал так
1> c(test).
{ok,test}
2> T1 = spawn(test,p,[]).
<0.38.0>
3> T1 ! {1}.
received 1
{1}
4> T1 ! {system,self(),suspend}.
{system,<0.31.0>,suspend}
5> T1 ! {2}.
{2}
6> T1 ! {system,self(),resume}.
{system,<0.31.0>,resume}
7> T1 ! {3}.
{3}
8> sys:resume(T1).
** exited: {noproc,{sys,resume,[<0.38.0>]}} **
9> T1 ! {4}.
{4}
после этого решил попробовать так
ps() ->
receive
{system, suspend} ->
put(state, suspend);
{system, resume} ->
put(state, resume)
after 0 ->
ok
end,
State = get(state),
if State == suspend ->
ps();
true ->
receive
{stop} ->
ok;
{Msg} ->
io:format("received ~p~n", [Msg]),
ps()
end
end.
но тогда ожидание получается активным, да и вообще криво как-то
как заставить sys:suspend и sys:resume работать?
Здравствуйте, Аноним, Вы писали:
Не мучался с саспендом никогда, но что обращает внимание — почему у тебя функция не рекурсивная? В случае саспенда/ресива у тебя она просто "закончится"
Здравствуйте, Аноним, Вы писали:
А>не пойму как работать с приостановкой процесса — не получается повторно запустить остановленный по suspend процесс.
А>вот код тестового модуля
[cut]
Посмотрел я тут это дело, если вкратце — RTFM
К примеру наш с миррорером
перевод (точней его, т.к. ту главу он переводил).
Ну и модуль твой будет выглядеть примерно так:
-module(test).
-export([p/0,system_continue/3]).
p() ->
receive
{X} ->
io:format("received ~p~n", [X]),
loop();
{system, From, Request} ->
sys:handle_system_msg(Request, From, self(), test, [], [])
end.
system_continue(Parent, Deb, Chs) -> p().
Причём сообщения, отправленные засуспенденному процессу после его реанимации будут обработаны.