[Erlang]как работать с sys:suspend?
От: Аноним  
Дата: 04.06.07 08:00
Оценка:
не пойму как работать с приостановкой процесса — не получается повторно запустить остановленный по 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 работать?
Re: [Erlang]как работать с sys:suspend?
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.06.07 09:25
Оценка:
Здравствуйте, Аноним, Вы писали:

Не мучался с саспендом никогда, но что обращает внимание — почему у тебя функция не рекурсивная? В случае саспенда/ресива у тебя она просто "закончится"
Re: [Erlang]как работать с sys:suspend?
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.06.07 20:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>не пойму как работать с приостановкой процесса — не получается повторно запустить остановленный по 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().


Причём сообщения, отправленные засуспенденному процессу после его реанимации будут обработаны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.