Aula nº 11

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.

OC 98-99 (Exercícios Práticos)


-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}.
Índice

Última actualização: 18 Abr 2005

OC 98-99 (Exercícios Práticos)