/* PrimeTriangle.java Run a MonitoredPrimeTriangle in its own thread. Works tightly with PrimeTriangleApplet. - Thread stuff isn't very clean or completely debugged. - Monitors need to be packaged better. Rich Acuff 28-Sep-97 */ public class PrimeTriangleThread extends Thread { MonitoredPrimeTriangle pt; PrimeTriangleApplet ap; int[] currentRow; Monitor[] monitors; MonitorDisplay disp = null; boolean keepGoing; IntMonitor rowM; DualMonitor ispM; DualMonitor reM; DualMonitor swapM; MemMonitor mem; TimeMonitor rowTimeM; TimeMonitor totalTimeM; public PrimeTriangleThread (PrimeTriangleApplet a) { ap = a; } public void run() { ap.stopButton.show(); rowM = new IntMonitor(ap.thisRowLabel); ispM = new DualMonitor(ap.rowIsPrimeLabel, ap.totalIsPrimeLabel); reM = new DualMonitor(ap.rowRearrangeLabel, ap.totalRearrangeLabel); swapM = new DualMonitor(ap.rowSwapLabel, ap.totalSwapLabel); mem = new MemMonitor(ap.freeLabel, ap.totalLabel); rowTimeM = new TimeMonitor(ap.rowTimeLabel); totalTimeM = new TimeMonitor(ap.totalTimeLabel); //yeah, yeah, this needs names (enumerations, acutally...) monitors = new Monitor[7]; monitors[0] = rowM; monitors[1] = ispM; monitors[2] = reM; monitors[3] = swapM; monitors[4] = mem; monitors[5] = rowTimeM; monitors[6] = totalTimeM; try { int nRows; int[][] rows; try {nRows = Integer.parseInt(ap.rowField.getText());} catch (NumberFormatException e) {nRows = 0;} if (nRows < 1) { ap.out.setText ("Please put an integer greater than zero in for the number of rows."); } else { ap.out.setText(""); if (ap.stats) {ap.statsHeader();} pt = new MonitoredPrimeTriangle(rowM, ispM, reM, swapM, mem, rowTimeM, totalTimeM); disp = new MonitorDisplay (monitors, 1); updateInterval (); disp.start(); if (ap.completeButton.getState()) { //all at once try { rows = pt.triangle (nRows); if (ap.stats) {ap.printStats(monitors);} else {ap.printRagged (rows);} } catch (NoSolution e) {ap.out.setText(e.toString());} } else if (ap.oneButton.getState()) { //one row period try { int[] row = pt.row (nRows); if (ap.stats) {ap.printStats(monitors);} else {ap.printRow (row);} } catch (NoSolution e) {ap.out.setText(e.toString());} } if (ap.stepButton.getState()) {stepByStep();} } } finally { ap.goOnButton.hide(); ap.keepGoingButton.hide(); ap.stopButton.hide(); ap.goButton.show(); if (disp != null) { disp.stop(); disp = null; } ap.running = false; } } public void goAway () { //die off gracefully, killing the monitor process (since Daemon doesn't seem to work) ap.goOnButton.hide(); ap.keepGoingButton.hide(); ap.stopButton.hide(); ap.goButton.show(); if (disp != null) { disp.stop(); disp = null; } this.stop(); ap.running = false; } private void stepByStep() { //do one row at a time, possibly pausing between each keepGoing = true; currentRow = new int[1]; currentRow[0] = 1; pt.resetMonitors(); if (ap.stats) {ap.printStats(monitors);} else {ap.printRow(currentRow);} ap.goOnButton.show(); ap.keepGoingButton.show(); while (true) { int r; ap.goOnButton.hide(); ap.keepGoingButton.hide(); try {currentRow = pt.nextRow(currentRow);} catch (NoSolution e) { ap.out.setText(e.toString()); break; } if (ap.verify && !pt.verifyRow(currentRow)) { ap.out.setText("Row " + currentRow.length + " didn't come out right!!!!"); return; } if (ap.stats) {ap.printStats(monitors);} else {ap.printRow(currentRow);} try {r = Integer.parseInt(ap.rowField.getText());} catch (NumberFormatException e) {r = 0;} if (keepGoing && currentRow.length >= r) {keepGoing = false;} if (!keepGoing) { totalTimeM.pause(); ap.keepGoingButton.show(); ap.goOnButton.show(); this.suspend(); totalTimeM.resume(); } } } void updateInterval () { //the user has changed the update interval--go get it long i; try {i = Long.parseLong(ap.intervalField.getText());} catch (NumberFormatException e) {i = 1;} i = i * 100; disp.setInterval (i); } }