begin process at 2012 02 15 03:36:35
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Java

 > 

Archives

 > 

Au secours

 > 

décalage de thread ... help please


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

décalage de thread ... help please

mardi 10 mai 2005 à 12:07:02 | décalage de thread ... help please

joebar3333

Bonjour,

après plusieurs problèmes avec les threads, j'ai voulu vérifier quelque chose de simple. Or même ce code source simple ne fonctionne pas comme je veux. Voici le source :

///////// Class main /////////
public class Main {
    /** Creates a new instance of Main */
    public Main() {
    }

    public static void main(String[] args) {
        NewClass thr = new NewClass();
        thr.start();
    }
}

///////////Class NewClass, celle du thread ////////////
public class NewClass extends Thread{
   
    /** Creates a new instance of NewClass */
    public NewClass() {
    }
    public void run()
    {
        while(true)
        {
           oh();
            try
            {            
                sleep(1000);               
            }
            catch(InterruptedException e)
            {
                System.out.println("erreur thread update " + e);
            }
        }
    }
   
    public void oh()
    {
               Timestamp t3 = new Timestamp(0);
                t3.setTime(System.currentTimeMillis());
                System.out.println("update graphik " + t3.toString());
    }
}

Ce que je veux faire est simple. Je veux que toutes les secondes, le thread m'affiche l'heure courante avec la fonction oh(). Le problème est qu'à l'exécution de ce prog, il se cré un décalage. La fonction oh() affiche :
12:08:18.117
12:08:19.118
12:08:20.119

Bref il se cré un décalage de 1 millisec toutes les secondes. Cette différence est très faible mais très importante pour moi. Pouvez-vous me corriger mon source pour qu'il m'affiche :
12:08:18.117
12:08:19.117
12:08:20.117

Un grand merci.
mardi 10 mai 2005 à 13:09:41 | Re : décalage de thread ... help please

bjdc

Ton code n'est s'execute ni de facon instantanée, ni prioriairement sur les autres process, ce qui peut expliquer le decalage.

Pour le deuxieme probleme, tu peux toujours tenter un setPriority(MAX_PROPRITY)

Pour le premier, y'a pas de solution simple. Si tu arrives a calculer le temps d'execution, tu peux ajuster la duree  du sleep, mais ca va dependre de la machine sur laquelle le code tourne...

mardi 10 mai 2005 à 13:30:22 | Re : décalage de thread ... help please

Dobel

ton code ne tient pas compte du temps de l'affichage. Je te propose une version modifiée.

On répcupère une valeur t0 de l'horloge, et on synchronise le programme par rapport à t0 +n*1000;


voilà le résultat que j'ai obtenu
A droite, l'heure système au moment de l'affichage dans la console. Ce n'est pas la même que l'heure qui est affichée à gauche
Les petites fluctuations correspondent à des délais d'affichages non constants, mais elles ne sont pas propagées.
 
update graphik 2005-05-10 13:30:27.078 -> 1115724627087
update graphik 2005-05-10 13:30:28.078 -> 1115724628079
update graphik 2005-05-10 13:30:29.078 -> 1115724629080
update graphik 2005-05-10 13:30:30.078 -> 1115724630080
update graphik 2005-05-10 13:30:31.078 -> 1115724631080
update graphik 2005-05-10 13:30:32.078 -> 1115724632080
update graphik 2005-05-10 13:30:33.078 -> 1115724633079
update graphik 2005-05-10 13:30:34.078 -> 1115724634080



public class Main {
  /** Creates a new instance of Main */
  public Main() {
  }

  public static void main(String[] args) {
    NewClass thr = new NewClass();
    thr.start();
  }
}

///////////Class NewClass, celle du thread ////////////
class NewClass
    extends Thread {

  /** Creates a new instance of NewClass */
  public NewClass() {
  }

  public void run() {
    long t0 = System.currentTimeMillis();
    oh(t0); // on affiche l'heure de t0. Cet affichage prend du temps.
    while (true) {
      t0 +=1000;// prochain repère : t0+1000
      try {
        sleep(t0-System.currentTimeMillis());//on fait une pause jusqu'à atteindre l'heure t0+1000;
      }
      catch (InterruptedException e) {
        System.out.println("erreur thread update " + e);
      }
      oh(t0);//on affiche t0+1000;
    }
  }

  public void oh(long t) {
    Timestamp t3 = new Timestamp(0);
    t3.setTime(t);
    System.out.println("update graphik " + t3.toString()+" -> "+System.currentTimeMillis());
  }
}


A+

Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
mardi 10 mai 2005 à 13:46:05 | Re : décalage de thread ... help please

Dobel

Réponse acceptée !
Pour préciser un peu,

Dans l'exemple au dessus, on triche évidemment en affichant une heure qui est calculée en rajoutant n*1000 à une valeur d'origine.
Mais ce qui est important, c'est que l'affichage est déclencher de façon très régulière (+- 1ms dans mon test), avec des écarts qui ne se propagent pas.

On peut donc aussi moins tricher, en affichant l'heure réelle. Mais le résultat est moins beau !

update graphik 2005-05-10 13:48:08.175 -> 1115725688182
update graphik 2005-05-10 13:48:09.175 -> 1115725689175
update graphik 2005-05-10 13:48:10.176 -> 1115725690176
update graphik 2005-05-10 13:48:11.176 -> 1115725691176
update graphik 2005-05-10 13:48:12.176 -> 1115725692177
update graphik 2005-05-10 13:48:13.175 -> 1115725693175
update graphik 2005-05-10 13:48:14.176 -> 1115725694176

le code correspondant :
-----
public class Main {
  /** Creates a new instance of Main */
  public Main() {
  }

  public static void main(String[] args) {
    NewClass thr = new NewClass();
    thr.start();
  }
}

///////////Class NewClass, celle du thread ////////////
class NewClass
    extends Thread {

  /** Creates a new instance of NewClass */
  public NewClass() {
  }

  public void run() {
    int n = 0;
    long t0 = System.currentTimeMillis();
    oh();
    while (true) {
      t0 +=1000;
      try {
        sleep(t0-System.currentTimeMillis());
      }
      catch (InterruptedException e) {
        System.out.println("erreur thread update " + e);
      }
      oh();
    }
  }

  public void oh() {
    Timestamp t3 = new Timestamp(0);
    t3.setTime(System.currentTimeMillis());
    System.out.println("update graphik " + t3.toString()+" -> "+System.currentTimeMillis());
  }
}

-----
Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
mardi 10 mai 2005 à 14:06:46 | Re : décalage de thread ... help please

joebar3333

Salut Dobel,
merci pour tes réponses précises et rapides. Ca marche ! Réponse acceptée sans pb.
J'en profite de tes compétences pour te diriger vers un de mes posts que je n'ai toujours pas pu résoudre : http://www.javafr.com/forum.v2.aspx?ID=450878

Si toutefois t'avais une idée, ça serait génial.

Merci encore.
mardi 10 mai 2005 à 14:39:32 | Re : décalage de thread ... help please

Dobel

lol, c'est juste que j'ai constaté que ça allait être mon 201ème message, donc je voulais poster quelque chose de pas trop con :D

Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
mardi 10 mai 2005 à 14:53:59 | Re : décalage de thread ... help please

joebar3333

ok, merci quand meme



Cette discussion est classée dans : public, thread, main, décalage, newclass


Répondre à ce message

Sujets en rapport avec ce message

inserer la classe main() dans une classe thread [ par amateur_java ] je veux inserer une classe main dans une autre classe thread mais je n'y arrive pas j'ai essayé de creer une nouvelle classe en y integrant la classe fonction static si écrite dans main ?? [ par Starter34 ] Bonjour, Je cherche un avis sur une situation que je ne comprends pas... En synthèse Eclipse me demande de modifier une méthode en static lorsque qu comment synchroniser deux thread qui n'ont pas le même temps d'attente [ par maymouta ] bonjour à tous, mon problème et comme suit: j'ai deux threads [code=java]thread 1{ // instructions appel à threads 2(); }[/code] le threads 1 se me Exception in thread "main" java.lang.NoClassDefFoundError [ par kharrat ] Salut,Je démarre avec Java, Eclipse et un parseur appelé Castor.J'ai importé le jar qui va bien pour utilisé Castor et mon programme test compile. J'a mon prg fonctionne pas [ par domxaline ] Bonjour, public class essaie { public static void main (String [] args) { for(int i = -3; i if (i==0) { continue; } System.out.println("inverse de " + Comprehension des Threads [ par mael974 ] Bonjour petite interrogation sur la notion de Thread voici un exemple sur lequel je me base: public class Film2 implements Runnable { public les Thread [ par didoux95 ] Bonjour a tous,j'ai un pb avec les thread:code:public class A {   public A(){      //la construction de l'interface graphique      Thread MonThread = éxécuter un une méthode d'une classe précise via un KeyListener [ par szambaux ] Bonjour j'ai besoin de piloter mon application via le clavier, pour cela j'ai créer une classe ClavierListener qui écoute le clavier, le but est que l synchronisation des threads [ par anjoelus ] je voudrai mettre le thread TA en veille puis le reveiller avec TB mais ca ne marche pas, au final TA et TB restent bloqués. merci de votre aide... // Problème start thread [ par raxstill ] Bonjour, J'ai commencé à écrire une petite application sur blackberry dans lequel, il y aurai un sleep de X temps sur sur thread principale. Mais


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,009 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales