Escreva um processo equivalente a uma impressora. O processo deve ter 4 estados:
O formato das mensagens que o processo deve receber é o seguinte:
Considere que a Impressora imprime uma pagina por segundo e gasta 1 Litro de tinta por
cada 200 folhas e cada folha demora determinado tempo fixo a imprimir (e.g. 100ms).
Para simplificar considere que a impressora verifica a tinta e o papel antes de imprimir
cada trabalho.
-module(aula11). -export([espera/3,por_tinta/1,por_papel/1,imprimir/2,start/0]). start()->register(printer,spawn(?MODULES,espera,[100,5,[]])).
espera(FPapel,LTinta,[])->
io:format("Impressora à espera ! ~n",[]),
receive
{ trabalho,Titulo,NPag } ->
imprimir(FPapel,LTinta,[{Titulo,NPag}]);
{tinta,NL}->
espera(FPapel,LTinta+NL,[]);
{papel,NF}->
espera(FPapel+NF,LTinta,[])
end;
espera(FPapel,LTinta,L)->imprimir(FPapel,LTinta,L).
imprimir(FPapel,LTinta,[])->
espera(FPapel,LTinta,[]);
imprimir(FPapel,LTinta,[{Titulo,NPag}|L]) when NPag >FPapel ->
sem_papel(FPapel,LTinta,[{Titulo,NPag}|L]);
imprimir(FPapel,LTinta,[{Titulo,NPag}|L]) when NPag*200 >LTinta ->
sem_tinta(FPapel,LTinta,[{Titulo,NPag}|L]);
imprimir(FPapel,LTinta,[{Titulo,NPag}|L])->
io:format(" Imprimindo ~s ~n",[Titulo]),
receive
after NPag*1000 -> true
end,
imprimir(FPapel-NPag,LTinta-(NPag/200),L).
sem_tinta(FPapel,LTinta,L)->
receive
{tinta,NLitros} ->
NLitros
end,
espera(FPapel,LTinta+NLitros,L).
sem_papel(FPapel,LTinta,L)->
receive
{papel,NPag} ->NPag
end,
espera(FPapel+NPag,LTinta,L).
por_tinta(NL)-> printer ! {tinta,NL}.
por_papel(NP)-> printer ! {papel,NP}.
imprimir(Titulo,NP)-> printer ! {trabalho,Titulo,NP}.
Última actualização: 18 Abr 2005