View Single Post
  #15 (permalink)  
Old 09-03-2008, 09:55 PM
Norm's Avatar
Norm Norm is offline
Senior Member
 
Join Date: Jun 2008
Location: Heredia, Costa Rica
Posts: 2,225
Norm is on a distinguished road
Replacement of loop with wait and notify
I took your posted code, made it into something that would execute and then modified it to use wait and notify:
First is your code with some dummy stuff:
Code:
// willemjav looping problem public class WaitLoops { boolean start; Cont cont; Waitloop wl; //----------------------------------------------------------- // Wait until start set private void waitloop() { wl = new Waitloop(); wl.start(); cont.setstartFlag(false); // cont.selectonoff(true); start=false; System.out.println(">>waitloop - entering loop"); do { } while (!start); // wait for start button System.out.println(">>waitloop - exited loop"); int trc = cont.gettrackNumb(); // read out the track number mainSoundblock(trc); } // end waitloop() int cnt; //------------------------------------------------------------------------- // Wait until StartFlag set class Waitloop extends Thread { public Waitloop() { cnt++; // the thread counter System.out.println("count wait thread " + cnt); // to see what it is looping } public void run() { cont.setstartFlag(false); do { } while (!cont.getstartFlag()); // read the start button start=true; // release waitloop looping System.out.println("exited thread " + cnt); } } class Cont { boolean flag; boolean esc; int tn; boolean getstartFlag(){return flag;} void setstartFlag(boolean f){ flag = f; System.out.println("set start flag " + flag); } int gettrackNumb() {return tn;} void settrackNumb(int trck) {tn = trck;} boolean getescFlag() {return esc;} void setescFlag(boolean f) {esc = f;} } private void mainSoundblock(int trck) { // cont.ed.resetFbo(); cont.setescFlag(false); // trig=false; // exit=false; if (trck==1 && !cont.getescFlag()) { Soundblock1(); cont.settrackNumb(trck); trck=2; } if (trck==2 && !cont.getescFlag()) { Soundblock2(); cont.settrackNumb(trck); trck=3; } if (trck==3 && !cont.getescFlag()) { Soundblock3(); cont.settrackNumb(trck); trck=4; } if (trck==4 && !cont.getescFlag()) { Soundblock4(); cont.settrackNumb(trck); trck=5; } // ....... etc until 12 System.out.println(" end of sound block " ); cont.setescFlag(false); // cont.ed.closeFbo1(); // cont.stopclk(); // cont.ed.resetFbo(); waitloop(); // NCR - RECURSIVE CALL??? } // end mainSoundBlock void Soundblock1(){} void Soundblock2(){} void Soundblock3(){} void Soundblock4(){} // Constructor -------------------------------- public WaitLoops() { cont = new Cont(); // Start a thread to set flag in 2 seconds Thread t = new Thread(new Runnable() { public void run() { for(int i=0; i < 5; i++) { try{Thread.sleep(2000);}catch(Exception x){} cont.setstartFlag(true); // release Waitloop thread looping } // end for(i) System.exit(0); // EXIT - END OF TEST } }); t.start(); waitloop(); } //-------------------------------------------------------------------- // Test the above public static void main(String[] args) { new WaitLoops(); } } // end class /* Running: "C:\Program Files\Java\j2re1.4.2_08\bin\java.exe" -cp D:\JavaDevelopment\Testing\JavaForum\;D:\JavaDevelopment;. WaitLoops count wait thread 1 set start flag false >>waitloop - entering loop set start flag false set start flag true <<<<<<< After 2 sec sleep exited thread 1 >>waitloop - exited loop end of sound block count wait thread 2 set start flag false >>waitloop - entering loop set start flag false >>>>>>>>>>> HERE I C+A+D and ended task 0 error(s) */
Then modified to use wait / notify
Code:
// willemjav looping problem - Changed to use wait() and notifyAll() public class WaitLoops2 { Cont cont; int cnt; //----------------------------------------------------------- // Wait until "user" presses start button (uses getstartFlag) private void waitloop() { while(true) { // do loop here vs a recursive call from mainSoundblock cnt++; Object mon = cont.setstartFlag(false); // be sure flag is off / get monitor // cont.selectonoff(true); System.out.println(">>waitloop - entering loop " + cnt); while(!cont.getstartFlag()) { synchronized(mon) { try{mon.wait();}catch(Exception x){} // wait until button pressed } } System.out.println(">>waitloop - exited loop " + cnt); int trc = cont.gettrackNumb(); // read out the track number mainSoundblock(trc); } } // end waitloop() //---------------------------------------------------- // Dummy class for testing class Cont { boolean flag; boolean esc; int tn; Object mon = new Object(); boolean getstartFlag(){ return flag; } Object setstartFlag(boolean f){ flag = f; System.out.println("set start flag " + flag); if(flag) { // when flag is set, release those waiting synchronized(mon) { mon.notifyAll(); // wakeup waiting thread } } return mon; // return monitor so caller can wait() on it } int gettrackNumb() {return tn;} void settrackNumb(int trck) {tn = trck;} boolean getescFlag() {return esc;} void setescFlag(boolean f) {esc = f;} } private void mainSoundblock(int trck) { // cont.ed.resetFbo(); cont.setescFlag(false); // trig=false; // exit=false; if (trck==1 && !cont.getescFlag()) { Soundblock1(); cont.settrackNumb(trck); trck=2; } if (trck==2 && !cont.getescFlag()) { Soundblock2(); cont.settrackNumb(trck); trck=3; } if (trck==3 && !cont.getescFlag()) { Soundblock3(); cont.settrackNumb(trck); trck=4; } if (trck==4 && !cont.getescFlag()) { Soundblock4(); cont.settrackNumb(trck); trck=5; } // ....... etc until 12 System.out.println(" end of sound block " ); cont.setescFlag(false); // cont.ed.closeFbo1(); // cont.stopclk(); // cont.ed.resetFbo(); if(cnt == 4) { // debug to show recursive calls - NONE with this code try{throw new Exception("Show Call Stack");}catch(Exception x){x.printStackTrace();} /* java.lang.Exception: Show Call Stack at WaitLoops2.mainSoundblock(WaitLoops2.java:97) at WaitLoops2.waitloop(WaitLoops2.java:23) at WaitLoops2.<init>(WaitLoops2.java:123) at WaitLoops2.main(WaitLoops2.java:129) */ } } // end mainSoundBlock // Dummy methods void Soundblock1(){} void Soundblock2(){} void Soundblock3(){} void Soundblock4(){} // ... // Constructor -------------------------------- public WaitLoops2() { cont = new Cont(); // Start a thread to set flag in 2 seconds // This is to simulate user pressing a button Thread t = new Thread(new Runnable() { public void run() { for(int i=0; i < 5; i++) { try{Thread.sleep(2000);}catch(Exception x){} cont.setstartFlag(true); // press button } // end for(i) System.exit(0); // EXIT - END OF TEST } }); t.start(); waitloop(); // Start the program process } // end Constructor //-------------------------------------------------------------------- // Test the above public static void main(String[] args) { new WaitLoops2(); } } // end class /* Running: "C:\Program Files\Java\j2re1.4.2_08\bin\java.exe" -cp D:\JavaDevelopment\Testing\JavaForum\;D:\JavaDevelopment;. WaitLoops2 set start flag false >>waitloop - entering loop 1 set start flag true >>waitloop - exited loop 1 end of sound block set start flag false >>waitloop - entering loop 2 set start flag true >>waitloop - exited loop 2 end of sound block set start flag false >>waitloop - entering loop 3 set start flag true >>waitloop - exited loop 3 end of sound block set start flag false >>waitloop - entering loop 4 set start flag true >>waitloop - exited loop 4 end of sound block java.lang.Exception: Show Call Stack at WaitLoops2.mainSoundblock(WaitLoops2.java:97) at WaitLoops2.waitloop(WaitLoops2.java:23) at WaitLoops2.<init>(WaitLoops2.java:123) at WaitLoops2.main(WaitLoops2.java:129) set start flag false >>waitloop - entering loop 5 set start flag true >>waitloop - exited loop 5 end of sound block set start flag false >>waitloop - entering loop 6 0 error(s) */
Reply With Quote