[90b9e4b] | 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: ; |
---|