Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : décalage de thread ... help please [ Archives / Au secours ] (joebar3333)

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


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


Répondre à ce message

Sujets en rapport avec ce message

Exception in thread "main" java.lang.noclassDefFoundError: [ par zzt6p2 ] Salut à tous,Je suis novice je viens d'installer JDK 1.4j'ai configurer le pathen mode command sous windowsje compil mon fichier text avec javacj'obti Problème de thread [ par Bouki ] Salut,Voici ce que j'ai fait, en faite je veux pouvoir faire des fenetres indépendantes les unes des autres, le pb c que pour ouvrir et fermer un thre Barre progression via thread [ par fred889944 ] Bonjour, j'aimerais afficher une barre de progression pendant l'execution d'une fonction nommée TOTO (son temps d'execution est relativement long)... scintillement dans mon thread [ par lonyc ] Bonjour,   On voit bien dans mon animation que j'efface l'image, ca fait un scintillement, c'est vraiment pas beau.   Et je pense avoir fait ce qu'i Thread et ThreadGroup comment les fermer ? [ par Omeda ] Bonjour tout le monde, Je suis actuellement entrain de faire une application client/serveur cependant je rencontre quelques difficultés avec les threa Thread declaré public static final dans une interface : absurde ? [ par jcodeunpeu ] Bonsoir à tous,petit souci avec un Thread: 1) je déclare dans une interface un  thread comme ceci :   public static final Thread personneInitialise = Redimensionner image dans applet [ par EvilGost ] alors, j'ai un petit prog en java qui affiche une image dans une applet.Le probleme, c'est que l'applet doit faire 300*200 et que l'image est en 600*4 "Exception in thread "main" java.lang.NoClassDefFoundError: Bonjour" [ par billou101 ] Salut,Je suis passé de Win2k à WinXP et j'en ai profité pour installé le nouveau JDK.J'ai spécifié le chemins:./bin./lib./include./demodans le "path"J thread et affichage graphique [ par bertrand69fr ] Bonjour, J'essaye de faire un programme simple du genre course de chevaux. Les chevaux sont simplement représentés par des cercles... Le problème est JPanel MousePressed et Freeze [ par xboubix ] Bonjour,j'essaye de faire un petit programme tout simple, dans lequel un Jpanel possède une image de fond, et un gif transparent se balade dedans, lor


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.