Avatar billede lizzy22 Nybegynder
29. maj 2001 - 13:14 Der er 1 kommentar og
1 løsning

tråde og sleep

I vort program skal vi gentagne gange kunne kalde en metode tilknyttet et objekt, som i dette tilfælde repræsenterer en motor. Når motorens køremetode kaldes med et tidsrum,skal objektet sende et signal til en anden objektype og efter at det ønskede tidsrum er gået sende et nyt signal. Undervejs i dette tidsrum skal det være muligt for andre objekter, at aflæse, hvor lang tid, der er gået af det tidsrum, motoren skal arbejde i. Dette er løst ved at lave en tråd af motorobjektet. Koden ser i grove træk ud som følger:

public class Motor implements Runnable
Thread motorTråd=new Thread(this)

public void start()
this.start

public void kør(float t)
this.tid=(int) t*1000
this.kør=true
this.startTid=system.currentTimeMillis();

public synchronized void run()
{ while(true)
  { if(kør)
    { Thread.sleep(this.tid);
      this.kør=false;}
    else
      Thread.sleep(200)}
}

public float aflæsKørtTid()
return (this.startTid-system.currentTimeMillis())

Problemet er så at man kan kalde de forskellige metoder en del gange, men pludselig holder der op med at ske noget og motorobjktet \"siger\" at det ikke er færdigt - hvad går der galt?
Avatar billede agermose Nybegynder
29. maj 2001 - 13:28 #1
det er lidt for grove træk... hvad laver f.eks. start()??

når, men umiddelbart ligger der vel et problem i at du kun kan kalde run én gang. Det er sikkert også meningen? men det er bestemt ikke måden at gøre det på.

hvad er det for en sekvens af kald, og hvad er det sidste kald, der \"siger\" hvad?
Avatar billede logical Nybegynder
29. maj 2001 - 17:05 #2
Lav den om til følgende:

public class Motor implements Runnable {
  private Thread worker = null;
  private int delay;
  private long startTime;

  public void kør(int delay) {
    if (worker == null) {
      this.delay = delay*1000;
      worker = new Thread(this);
      startTime = System.currentTimeMillis();
      worker.start();
    }
  }

  public void run() {
    int myDelay = delay;
    signalSomebodyBefore(); // Whatever.
    try {
      Thread.sleep(myDelay);
    catch (InterruptedException e) {}
    signalSomebodyAfter(); // whatever.
    worker = null;
  }

  public float aflæsKørtTid() {
    return (worker == null) ? Float.Nan : startTid-System.currentTimeMillis();
  }
}
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