Avatar billede dannv Nybegynder
20. december 2002 - 22:46 Der er 3 kommentarer og
1 løsning

Tråde: Simulering af cheduling, UI bliver ikke opdateret!(HASTER)

Jeg er ved at lave en simulering af CPU scheduling vha. tråde. Mit problem er, at efter jeg har sat mine algoritmer i gang med at stoppe og starte mine tråde som det er tiltænkt, bliver min UI først opdateret når alle trådene er kørt helt færdige. (Jeg kan se på udskrift at algoritmerne gør som de skal!)

Jeg er sikker på at det er fordi min metode til at starte algoritmerne ligger i event-dispatch tråden, men jeg ved ikke helt hvordan jeg ellers skal gøre. Skal jeg have en selvstændig tråd som starter algoritmen + en selvstændig tråd som tager sig af at opdatere UI(skal det være en tråd som kalde repaint)?? Og hvordan skal jeg gøre dette?

Her kommer lige noget kode(håber det er nok). (der er mere, flere algoritmer, + de indledende GUi). Dette er hoved appletten. Inden den er der vha af andre GUI valgt algoritme+antallet af tråde+prioritet for den enkelte tråd.


public class Simulation extends JApplet implements Runnable {

    static int RANGE = Integer.parseInt(RaceGUI1.antal);
    private Runner[] runners = new Runner[RANGE];
    ThreadManager manager = new ThreadManager(this);
    Runner[] threadrun = new Runner[RANGE];
    private Thread updateThread = null;
    private Button StartButton = new Button();
    Runner threadStart;

    public void init()
    {
      manager.ThreadCreator();

        if (updateThread == null) {
            updateThread = new Thread(this);
            updateThread.setPriority(10);
        }
        AppletContentPane acp = new AppletContentPane();
        setContentPane(acp);
        acp.add(StartButton);
        System.out.println("End af init!");
    }
  //Meningen var at UI skulle gentegnes hver 3. millisek.
    public void run() {
        Thread myThread = Thread.currentThread();
        while (updateThread == myThread) {
            repaint();
            try {
                Thread.sleep(3);
            } catch (InterruptedException e) { }
        }
    }

    class AppletContentPane extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            String tal = ("12345678910");

            for (int i=0; i<RANGE; i++)
            {
              int m = 75 + (i*25);
              g.setColor(Color.black);
              g.drawString("Tråd nr.",5,50);
              g.drawString(tal.substring(i,i+1),10,m+6);
              g.setColor(Color.blue);
              g.fillRect(35,m,threadrun[i].tick,4);

              for (int n=35; n<=310; n=n+10)
              {
              g.setColor(Color.white);
              g.fillRect(n,m,1,4);
              }
    }
    }
}

  public Simulation() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception {
    StartButton.setFont(new java.awt.Font("Serif", 1, 14));
    StartButton.setLabel("START SIMULERING");
    StartButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        StartButton_actionPerformed(e);
      }
    });
    this.getContentPane().add(StartButton, BorderLayout.NORTH);
  }

  void StartButton_actionPerformed(ActionEvent e)
  {
    if (!updateThread.isAlive())
            updateThread.start();
    manager.ThreadStarter();
    manager.ThreadChooser();
    manager.CallAlgorithm(); //Her sættes algoritmerne igang….
  }
}
/*----------------------------------------------------*/

Min worker thread, repræsenterer et job, tæller fra 0 til 275.

public class Runner extends Thread {
    public int tick = 1;
    public int number;

    public Runner(int n)
    {
      number = n;
    }

    public synchronized void run() {
        while (tick <= 275)
        {
            tick++;
            try {Thread.sleep(100);}
            catch (InterruptedException e) {}
            System.out.println("nummer tråd: "+number+" Tick: "+tick);
        }
    }
}

/*------------------------------------------------------*/

Denne klasse udgør den ene algoritme:

public class Priority
{
ThreadManager manager;
public Priority()
{
    Runner runthread;
    //denne løkke kører ren prioritet. Hvis flere tråde i en klasse vælges en som kører færdig.
    for (int n=9; n>=0; n=n-1)
        {
              while(!manager.threadList[n].isEmpty())
              {
//et the first thread in the list with priority n. Start from priotitylevel 10
  runthread = ((Runner) manager.threadList[n].getFirst());
  runthread.resume();
  manager.threadList[n].removeFirst();
  while(runthread.isAlive() && runthread.tick % 275 != 0)
  {}
  runthread.stop();
  }
}
}
}
/-------------------------------------------------*/
Denne klasse ligger de enkelte tråde i en linkedList ordnet efter priorietet.  Samt opretter trådene og starter og siger suspend(). (jeg ved godt den vil udgå, og der findes bedre alternativer).

public class ThreadManager {

Simulation a;
//create an array of linked lists
public static LinkedList [] threadList = new LinkedList [10];

  public ThreadManager(Simulation s)
  {
    a = s;
  }

  public void ThreadCreator()
  {
    for (int i = 0; i < a.RANGE; i++)
    {
      a.threadrun[i] = new Runner(i);
      a.threadrun[i].setPriority(Integer.parseInt(RaceGUI2.s[i]));
  }
  }

  //Starter alle tråde og siger suspend() direkte derefter.
  public void ThreadStarter()
  {
    for (int i = 0; i < a.RANGE; i++)
    {
      a.threadrun[i].start();
      a.threadrun[i].suspend();
    }
  }

  public void ThreadChooser()
  {
    for (int n=0;n<=9;n++)
    {
      //add 10 linked lists to the array. One for each possible priority
      threadList[n] = new LinkedList ();
    }

    for (int n=0; n<a.RANGE; n++)
    {
      int priority = a.threadrun[n].getPriority();
      //add the thread to the linked list with relevant priority
      threadList[priority].addLast(a.threadrun[n]);
    }
  }

  public void CallAlgorithm()
  {
    if(RaceGUI1.selectedalgo == "Priority 0-100%")
      {
        Priority p = new Priority();
      }
    if(RaceGUI1.selectedalgo == "Round Robin")
      {
        RoundRobin r = new RoundRobin(a.RANGE);
      }
    if(RaceGUI1.selectedalgo == "Priority w/RR")
      {
        PriorityWRoundRobin pwr = new PriorityWRoundRobin();
      }
  }
}

Please somebody help. Det haster da det er til et projekt som skulle afleves den 19. dec....!

Dann
Avatar billede dsj Nybegynder
21. december 2002 - 14:11 #1
Prøv at lave en selvstændig tråd som starter endnu en selvstændig tråd, som så starter dine algoritmer, mener det skulle virke.

Det er ikke nødvendigt med en tråd til at update GUI...
Avatar billede arne_v Ekspert
21. december 2002 - 16:08 #2
Det er ikke nok kode, da vi ikke kan selv kan prøve at compile/køre
dit program

(og en sådan fejl er rar at kunne se på sit eget system for at kunne
gennemskue problemet)
Avatar billede dannv Nybegynder
22. december 2002 - 14:59 #3
Hej dsj,

Tak for svaret. Det var næsten det rigtige, det var bare en enkelt tråd mere der skulle bruges, hvor jeg kaldte til den algoritme som var valgt...

mvh Dann
Avatar billede dsj Nybegynder
22. december 2002 - 15:06 #4
ok godt :)
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