| [7bef8cf] | 1 | BEGIN | 
|---|
|  | 2 | CLASS Consumer( prod ); | 
|---|
|  | 3 | REF(Producer) prod; ! constructor parameter; | 
|---|
|  | 4 | HIDDEN p1, p2, status, done, Main; | 
|---|
|  | 5 | BEGIN | 
|---|
|  | 6 | INTEGER p1, p2, status; | 
|---|
|  | 7 | BOOLEAN done; | 
|---|
|  | 8 | PROCEDURE main; | 
|---|
|  | 9 | BEGIN | 
|---|
|  | 10 | INTEGER money, receipt; | 
|---|
|  | 11 |  | 
|---|
|  | 12 | money := 1; | 
|---|
|  | 13 | WHILE NOT done DO BEGIN | 
|---|
|  | 14 | OutText( "cons receives: " ); | 
|---|
|  | 15 | OutInt( p1, 3 ); | 
|---|
|  | 16 | OutText( ", " ); | 
|---|
|  | 17 | OutInt( p2, 3 ); | 
|---|
|  | 18 | status := status + 1; | 
|---|
|  | 19 | OutText( " and pays $" ); | 
|---|
|  | 20 | OutInt( money, 3 ); OutImage; | 
|---|
|  | 21 | receipt := prod.payment( money ); | 
|---|
|  | 22 | OutText( "cons receipt #" ); | 
|---|
|  | 23 | OutInt( receipt, 3 ); OutImage; | 
|---|
|  | 24 | money := money + 1; | 
|---|
|  | 25 | END; | 
|---|
|  | 26 | OutText( "cons stops" ); OutImage; | 
|---|
|  | 27 | END; | 
|---|
|  | 28 | INTEGER PROCEDURE delivery( p1p, p2p ); | 
|---|
|  | 29 | INTEGER p1p, p2p; | 
|---|
|  | 30 | BEGIN | 
|---|
|  | 31 | p1 := p1p; | 
|---|
|  | 32 | p2 := p2p; | 
|---|
|  | 33 | Resume( THIS Consumer ); | 
|---|
|  | 34 | delivery := status; | 
|---|
|  | 35 | END; | 
|---|
|  | 36 | PROCEDURE stop; | 
|---|
|  | 37 | BEGIN | 
|---|
|  | 38 | done := TRUE; | 
|---|
|  | 39 | Call( THIS Consumer ); | 
|---|
|  | 40 | END; | 
|---|
|  | 41 | ! Consumer constructor code; | 
|---|
|  | 42 | status := 0; | 
|---|
|  | 43 | done := FALSE; | 
|---|
|  | 44 | Detach; | 
|---|
|  | 45 | main; | 
|---|
|  | 46 | END Consumer; | 
|---|
|  | 47 |  | 
|---|
|  | 48 | CLASS Producer; | 
|---|
|  | 49 | HIDDEN cons, N, money, receipt, Main; | 
|---|
|  | 50 | BEGIN | 
|---|
|  | 51 | REF(Consumer) cons; | 
|---|
|  | 52 | INTEGER N, money, receipt; | 
|---|
|  | 53 | PROCEDURE main; | 
|---|
|  | 54 | BEGIN | 
|---|
|  | 55 | INTEGER i, p1, p2, status; | 
|---|
|  | 56 |  | 
|---|
|  | 57 | FOR i := 1 STEP 1 UNTIL N DO BEGIN | 
|---|
|  | 58 | p1 := RandInt( 1, 100, p1 ); | 
|---|
|  | 59 | p2 := RandInt( 1, 100, p2 ); | 
|---|
|  | 60 | OutText( "prod delivers: " ); | 
|---|
|  | 61 | OutInt( p1, 3 ); OutText( ", " ); | 
|---|
|  | 62 | OutInt( p2, 3 ); OutImage; | 
|---|
|  | 63 | status := cons.delivery( p1, p2 ); | 
|---|
|  | 64 | OutText( "prod status: " ); | 
|---|
|  | 65 | OutInt( status, 3 ); OutImage; | 
|---|
|  | 66 | END; | 
|---|
|  | 67 | cons.stop; | 
|---|
|  | 68 | OutText( "prod stops" ); OutImage; | 
|---|
|  | 69 | END; | 
|---|
|  | 70 | INTEGER PROCEDURE payment( moneyp ); | 
|---|
|  | 71 | INTEGER moneyp; | 
|---|
|  | 72 | BEGIN | 
|---|
|  | 73 | money := moneyp; | 
|---|
|  | 74 | OutText( "prod payment of $" ); | 
|---|
|  | 75 | OutInt( money, 3 ); OutImage; | 
|---|
|  | 76 | Resume( THIS Producer ); | 
|---|
|  | 77 | receipt := receipt + 1; | 
|---|
|  | 78 | payment := receipt; | 
|---|
|  | 79 | END; | 
|---|
|  | 80 | PROCEDURE start( Np, consp ); | 
|---|
|  | 81 | INTEGER Np; | 
|---|
|  | 82 | REF(Consumer) consp; | 
|---|
|  | 83 | BEGIN | 
|---|
|  | 84 | N := Np; | 
|---|
|  | 85 | cons :- consp; | 
|---|
|  | 86 | Resume( THIS Producer ); | 
|---|
|  | 87 | END; | 
|---|
|  | 88 | ! Producer constructor code; | 
|---|
|  | 89 | receipt := 0; | 
|---|
|  | 90 | Detach; | 
|---|
|  | 91 | main; | 
|---|
|  | 92 | END Producer; | 
|---|
|  | 93 | ! program main equivalent; | 
|---|
|  | 94 | REF(Producer) prod; | 
|---|
|  | 95 | REF(Consumer) cons; | 
|---|
|  | 96 | prod :- NEW Producer; | 
|---|
|  | 97 | cons :- NEW Consumer( prod ); | 
|---|
|  | 98 | prod.start( 5, cons ); | 
|---|
|  | 99 | END; | 
|---|
|  | 100 |  | 
|---|
|  | 101 | ! Local Variables: ; | 
|---|
|  | 102 | ! tab-width: 4 ; | 
|---|
|  | 103 | ! compile-command: "cim ProdCons.sim" ; | 
|---|
|  | 104 | ! End: ; | 
|---|