Toon posts:

[JAVA] loop om de 10 seconden?

Pagina: 1
Acties:

Verwijderd

Topicstarter
hallo,

een vraagje, wss wel een heel stomme vraag, maar ik blijk er in vast te zitten.

ik heb dit:

Java:
1
2
3
4
5
6
7
8
9
10
public void run () {
// enkele acties enz om de juiste data te zoeken
          HttpConnection connection = (HttpConnection) Connector.open(data); // waarbij data een string is idv http://www.host.com/data.php?logs=ccccc
          connection.setRequestMethod(HttpConnection.GET);
           int rc = connection.getResponseCode();           
                if (rc == HttpConnection.HTTP_OK) {
                    System.out.println ("verbinding gelukt");
                data=""; hier zet ik de datastring terug op 0 ..
// maar nu ??
}


de bedoeling is dus dat er iedere 10 seconden een nieuwe versie van data moet verstuurt worden .. hoe moet ik dat juist doen ..

dus ie moet 10 seconden later opnieuwe gerunt worden .. is dat mogelijk ?

grtz

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

Dat is wel heel basic Java hoor:
Java:
1
2
3
4
while (true) {
    //doe hier je ding
    Thread.sleep(10000);
}

[ Voor 2% gewijzigd door NetForce1 op 20-02-2006 16:34 . Reden: seconden zijn wat anders dan milliseconden he ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 10-04 21:49
java.util.Timer
java.util.TimerTask

?

[ Voor 5% gewijzigd door Kwistnix op 20-02-2006 16:37 ]


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 09-04 15:04

Koppensneller

winterrrrrr

NetForce1 schreef op maandag 20 februari 2006 @ 16:33:
Dat is wel heel basic Java hoor:
Java:
1
2
3
4
while (true) {
    //doe hier je ding
    Thread.sleep(10000);
}
Doe het dan meteen goed:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
while(true)
{
  //Doe je ding
  try
  {
    Thread.sleep(10000);
  } 
  catch(InterruptedException e) 
  {
    System.err.out(e.toString());
  }
}

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 10-04 21:49
KoppenSneller schreef op maandag 20 februari 2006 @ 16:43:
[...]

Doe het dan meteen goed:

[...]
Wel een logger gebruiken dan he ;)

Verwijderd

Ik zie een http connection en je zegt dat je data wilt versturen. Dat botst enigzins bij mij. Wat probeer je precies te bereiken?

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 08-04 02:18

Nick_S

++?????++ Out of Cheese Error

Doe het dan meteen beter :9

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private boolean isRunning = true;
public void run() {
while(isRunning)
{
  //Doe je ding
  try
  {
    Thread.sleep(10000);
  } 
  catch(InterruptedException e) 
  {
    System.err.out(e.toString());
  }
}
}

public void stop() {
isRunning = false;
}

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • KnEuTeR
  • Registratie: Mei 2000
  • Laatst online: 24-02-2024

KnEuTeR

iedereen heeft een handelsmerk

KoppenSneller schreef op maandag 20 februari 2006 @ 16:43:
[...]


Doe het dan meteen goed:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
while(true)
{
  //Doe je ding
  try
  {
    Thread.sleep(10000);
  } 
  catch(InterruptedException e) 
  {
    System.err.out(e.toString());
  }
}
Doe het dan meteen ECHT goed ;), het ligt er ook aan hoe precies die 10 seconden moeten zijn. Als je met Thread.sleep() gaat werken dan zal je licht gaan verschuiven in de tijd, doordat het niet altijd PRECIES 10000 milliseconden zijn. Als dit niet erg is verder, dan zo laten, maar anders is het zo netter:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private long updatetime = System.currentTimeMillis();
private boolean running = true;

public void run(){

    while(running){
        if( System.currentTimeMillis() > updateTime ){

            // ga code doen

            updatetime += 10000 - (System.currentTimeMillis() - updatetime);
        }
        try {
            Thread.sleep(10); // om niet 100% load te krijgen, nu is hij op 10millisec nauwkeurig
        } 
        catch(InterruptedException e) {
            System.err.out(e.toString());
        }
    }

}


code niet getest maar zo moet het ongeveer zijn :)

[ Voor 6% gewijzigd door KnEuTeR op 20-02-2006 17:02 ]

Computers ain't that smart, Whatever man built could be taken apart


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

KnEuTeR schreef op maandag 20 februari 2006 @ 16:59:
Doe het dan meteen ECHT goed ;), het ligt er ook aan hoe precies die 10 seconden moeten zijn. Als je met Thread.sleep() gaat werken dan zal je licht gaan verschuiven in de tijd, doordat het niet altijd PRECIES 10000 milliseconden zijn. Als dit niet erg is verder, dan zo laten, maar anders is het zo netter:
De kans is dat deze loop niet van buitenaf gestopt kan worden omdat de thread die de loop uitvoert eventueel een versie van de 'running' uit een register haalt en niet de meest actuele 'in memory' versie gebruikt. Daarom moet je het veld volatile maken zodat dit probleem zich niet meer kan voordoen.

Een ander probleem aan deze code is dat longs (en doubles) niet atomic worden gezet. Als een andere thread die updatetime uitleest, kan het voorkomen dat er een niet bestaande waarde wordt uitgelezen omdat de helft al is gezet, en de andere helft niet. Je kunt dit op meerdere manieren oplossen, bv door de toegang te synchronizen of een AtomicLong te gebruiken. (Het zou misschien zelfs kunnen door het veld volatile te maken aangezien er synchronisatie van de waarde tussen de threads moet plaatvinden, maar ik denk niet dat volatile dan op de juiste manier wordt gebruikt).

[edit]
Tip:
Probeer alle threading problematiek uit je objecten te houden. Je moet wel zorgen dat je objecten threadsafe zijn (dit kan al complex genoeg zijn), maar alle thread aansturing kan je heel eenvoudig uit objecten trekken.

vb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Game{
  void tick();
}

class GamerTicker implements Runnable{
    Game game;

    void run(){
       while(true){
             game.tick();
              ...sleep
       }
    }
}

new Thread(new GameTiker(new SomeGame()).start();

Het voordeel is dat je je code veel beter kunt testen, veel beter kunt hergebruiken en veel duidelijker is. Als je nu bv de aansturing wilt vervangen door een Timer, dan kan je dat erg eenvoudig doen aangezien de aansturing niet in de componenten verwerkt zit.

[ Voor 61% gewijzigd door Alarmnummer op 20-02-2006 18:25 ]


Verwijderd

Als je sleept, krijgt ie dan wel data binnen van die connection?

Kbedoel.. volgesnmij moet je de connection altijd ope laten, zonder sleeps ofsow, in een aparte thread en dan in een andere thread die data (om de 10 sec) verwerken..

maar zoals gezegd.. wat ben je van plan ? :P

  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
Thread.sleep() wachtte volgens mij trouwens meestal 64 ms ipv 10 ms als kleinste eenheid; het is zeg maar een soort gegarandeerd minimum ;)

[ Voor 10% gewijzigd door 12_0_13 op 20-02-2006 18:16 ]


  • Flapp
  • Registratie: December 2004
  • Laatst online: 02-01 20:16
Turnbased multiplayergame O-) ?
is sleep in milliseconden of seconden ?

[ Voor 40% gewijzigd door Flapp op 20-02-2006 18:17 ]

"Stilte, een gat in het geluid...."


Verwijderd

Topicstarter
Verwijderd schreef op maandag 20 februari 2006 @ 18:15:
Als je sleept, krijgt ie dan wel data binnen van die connection?

Kbedoel.. volgesnmij moet je de connection altijd ope laten, zonder sleeps ofsow, in een aparte thread en dan in een andere thread die data (om de 10 sec) verwerken..

maar zoals gezegd.. wat ben je van plan ? :P
ik ben van plan online diagnose te doen van machines ;)

dus een machine stuurt seriele data naar een gsm module .. en deze stuurt dit door naar het internet dmv een php pagina aan te roepen :)

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 10-04 14:47
milliseconden

Verbouwing

Pagina: 1