Avatar billede wale Nybegynder
31. december 2005 - 01:31 Der er 7 kommentarer og
1 løsning

Inner Class Suspend og Resume

Hey Godt nytår!!!

Jeg har en en inner class som jeg skal have til at suspende og resume via en knap. Mit problem er at jeg ikke kan komme i kontakt med den. Min fil ser ud som følger:


    public class RightPanel extends JPanel
  {
………
   
      public RightPanel()
      {
………………………………………..
     
        //makes the StepCheck CheckBox
        StepCheck = new JCheckBox("Stepvis");
        StepCheck.setBackground (Color.gray);
        StepCheck.setHorizontalAlignment(JCheckBox.CENTER);
        StepCheck.setEnabled (false);
         
        StepCheck.addActionListener(new ButtonListener());
     
        // Opretter knapper
        start = new JButton("Start");
        step = new JButton("Next step");
        stop = new JButton("Stop");       
     
        step.setEnabled (false);
        stop.setEnabled (false);

        start.addActionListener(new ButtonListener());
        stop.addActionListener(new ButtonListener());
        step.addActionListener(new ButtonListener());
     
        // Tilf�jer knapper til panel
        ControlRightDownDownPanel.add (StepCheck);
        ControlRightDownDownPanel.add (start);
        ControlRightDownDownPanel.add (stop);
        ControlRightDownDownPanel.add (step);
       
                     
      }
      class Consumer extends Thread
      {
        opgave2b producer;
     
          Consumer(opgave2b p) {
            producer = p;
        }
        private int i=0;
          public void run() {
            int a,b,d,n;
         
            int x,y;
            String[] tal;
            try {
              while ( true ) {
                  String message = producer.getMessage();
                  //System.out.println("Got message: " + message);
              _ //guiFrame.Textbox.append ("f(x,y) : "+ message+" \n");
                  tal = message.split (" ");
                  RightPanel.Textbox.append ("f(x,y) : " + tal[5] + "\n");
                  RightPanel.Textbox.setCaretPosition( RightPanel.Textbox.getText().length() );
                  a = (int) Double.parseDouble(tal[0]);
                  b = (int) Double.parseDouble(tal[1]);
                  d = (int) Double.parseDouble(tal[2]);
                  x = (int) Double.parseDouble(tal[3]);
                  y = (int) Double.parseDouble(tal[4]);
                  i = Integer.parseInt(tal[6]);
                  n = (int) Double.parseDouble(tal[7]);

                  grafer(a,b,d,x,y,i,n);
              _
                  sleep( 200 );
                  holdt();
              _// start.setEnabled (false);
              }
            } 
                catch( InterruptedException e ) { }
         
        }
          public void holdt () throws InterruptedException
        {
            if (stepping==0){
              if (run ==1){
                  stop();}
            }
            else{
              System.out.println("DET er run: " + run);
              if (run ==0){
                  run=2;
                  System.out.println("DET er run: I 0 " + run);}
              if (run ==1){
                  stop();}
              if (run ==2){
                  suspend();
                  sleep(5000);
                  System.out.println("DET er run: I SUSPEND " + run);
                  run=3;
              }
              if (run ==3){
                  resume();
                  System.out.println("DET er run: I RESUMED " + run);
              //run=2;
              }
            }
        }
      }
      public synchronized void grafer (int a,int b, int d, int x, int y,int i,int n) throws InterruptedException
      {
        Graph o = new Graph();
        Graph.go go = o.new go();
        go.inner(a,b,d,x,y,i,n);
      _//_repaint();
      }

      private class ButtonListener implements ActionListener
      {
          public void actionPerformed (ActionEvent event)
        {
       
            if(event.getSource() == start)
            {
              run = 0;
              stepping = 0;
              stop.setEnabled (true);
              StepCheck.setEnabled (true);
              RightPanel.Textbox.setText(null);
           
           
              opgave2b producer = new opgave2b();
              producer.start();
            //new Consumer( opgave2b ).start();
              new Consumer( producer ).start();
           
           
              int length = filename.length();
            //System.out.println(testing);
           
              if (length == 0){
                  RightPanel.log.append("You have not choosen a .fac file \nso eilon51.fac is beeing used as \ndefault\n\n");
                  filename = "eilon51.fac";
                  opgave2b.filename = filename;
              //Graph.filename = filename;
              }
              else{
                  opgave2b.filename = filename;
              //Graph.filename = filename;
              }
           
              if (opgave2b.vaegt == 0)
              {
                  RightPanel.log.append("Also, you have not choosen a \nscenario therefore scenario 1 is \nset as default\n");
                  opgave2b.vaegt = 1;
              }
            //System.out.println(comeon);
              repaint();
           
            }
                       
       
            if(event.getSource() == stop)
            {

              run = 1;
              StepCheck.setEnabled (false);
            }
        _
            if(event.getSource() == step)
            {
              run = 3;
           

              System.out.println("Step");
           
           
            }
        _
            if(event.getActionCommand().equals("1"))
            {
              System.out.println("valgt nummer 1");
              opgave2b.vaegt = 1;
            }
           
            if(event.getActionCommand().equals("2"))
            {
              System.out.println("valgt nummer 2");
              opgave2b.vaegt = 2;
            }____
           
            if(event.getActionCommand().equals("3"))
            {
              System.out.println("valgt nummer 3");
              opgave2b.vaegt = 3;
            }
        _
            if(StepCheck.isSelected())
            {
              start.setEnabled (false);
              step.setEnabled (true);
              stepping=1;
            //run = 3;
            //System.out.println(stepping);
            }
            else
            {
              start.setEnabled (true);
              step.setEnabled (false);
              stepping=0;
            //System.out.println(stepping);
            }
           
        }

      }
 
 
  }


Det er i klassen Consumer under metoden run jeg skal have den til at suspende, ved at trykke en knap. Bagefter ved at trykke en knap skal tråden resumes() og så suspends() igen.

Håber der er nogle der kan hjælpe!!
På forhånd tak
Avatar billede _carsten Nybegynder
31. december 2005 - 10:52 #1
Sådan:

RightPanel.Consumer c = new RightPanel.Consumer();

Og så når jeg vist ikke mere i dag - godt nytår
Avatar billede schwarz84 Nybegynder
31. december 2005 - 11:09 #2
suspend() og stop() er deprecated og bør ikke bruges da de kan lave en skrækkelig ballade på runtime. Brug metoden wait() på Object i stedet. Så kan du bruge notify() til at starte den igen. De to ting kan jo så knyttes til et tryk på en knap...
Avatar billede wale Nybegynder
31. december 2005 - 11:12 #3
Jeg får følgende fejl når jeg compiler

RightPanel.java:368: cannot find symbol
symbol  : constructor Consumer()
location: class RightPanel.Consumer
            RightPanel.Consumer c = new RightPanel.Consumer();

Jeg kan ikke rigtig få den til at få fat i den inner class.
Avatar billede wale Nybegynder
31. december 2005 - 11:14 #4
Okay, hvordan vil du så mene jeg skal sende et wait og et notyfy til min klasse. Jeg har virkelig prøvet meget, men synes ikke at kunne få fat iden på nogen måder
Avatar billede wale Nybegynder
31. december 2005 - 11:44 #5
Jeg har lavet en stop knap ved at kalde en variabel run og sætte den lig en. Inde i min Consumer checker den så om run er 1 og hvis den er det kalder den et stop(). Dette kan jeg ikke få ført over på et wait() el. suspend(). Dvs. jeg får den første gang jeg trykker knappen, til at waite el suspende. Jeg kan dog ikke ikke komme ind i Consumer klassen igen og få den sat til notify() el. resume(). Så tråden fortsætter
Avatar billede _carsten Nybegynder
31. december 2005 - 16:10 #6
Nå, det alligevel til at hurtigt eksempel

Du får fejl p.g.a. den manglende parameter (opgave2b p)

Jeg ved ikke om det til at gennemskue, men prøv at køre det.


import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class RightPanel extends JFrame {
    JButton start = new JButton("start");
    JButton stop = new JButton("stop");
    RightPanel.Consumer c;
   
    boolean keepRunning = false;
   
    public RightPanel() {
        setLayout(new FlowLayout());
        start.addActionListener(new ButtonListener());
        add(start);
       
        stop.addActionListener(new ButtonListener());
        add(stop);
       
        setSize(300,100);
    }
     
    public synchronized boolean getKeepRunning(){
        while (!keepRunning) {
            try {
                wait();
            } catch (InterruptedException e) { }
        }
       
        notifyAll();
        return keepRunning;
    }
   
    public synchronized void setKeepRunning(boolean b){
        keepRunning = b;
        notifyAll();
    }
   
    class Consumer extends Thread {
        int i = 0;
        public void run() {
            while(getKeepRunning()){
                System.out.println("" + i);
                i++;
            }
        }
    }
       
    private class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
           
            if(event.getSource() == start) {
                keepRunning = true;
                if(c == null){
                    c = new RightPanel.Consumer();
                    c.start();
                }   
                else
                    setKeepRunning(true);
            }
           
            if(event.getSource() == stop) {
                setKeepRunning(false);
            }                       
        }
    }
   
   
    public static void main(String[] a){
        RightPanel r = new RightPanel();
        r.setVisible(true);
    }
}
Avatar billede wale Nybegynder
01. januar 2006 - 21:23 #7
Dit eksempel har hjulpet mig, så jeg har fundet en løsning.
Mange tak for hjælpen.
Smidder du et svar?
Avatar billede _carsten Nybegynder
01. januar 2006 - 21:59 #8
Kommer her.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester