IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

[Thread][Horloge système]Réveiller un thread selon l'horloge


Sujet :

Concurrence et multi-thread Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut [Thread][Horloge système]Réveiller un thread selon l'horloge
    Bonjour à tous,

    Voila, dans mon appli je crée un Thread qui doit effectuer une tache en fond entre deux heures définies par l'utilisateur.

    Dans le constructeur du thread je récupère la date courante de cette maniere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GregorianCalendar cal = new GregorianCalendar();
    d = cal.getTime();
    Ensuite voila ma méthode run() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public void run(){
            while(true){
             if(beginH<endH){
                    if((d.getHours()>=beginH) && (d.getHours()<endH)){
                     System.out.println(d.toLocaleString());
                     try {
             Thread.sleep(5000);
            } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
                    }
                    else try {
                     //sleeps for 15 minutes
                        Thread.sleep(900000);                    
                    }catch (InterruptedException e){
                        System.out.println(e.getMessage());
                    }
             }
             if(beginH>endH){
              if((d.getHours()>=beginH) || (d.getHours()<endH)){
               System.out.println(d.toLocaleString());
               try {
          Thread.sleep(5000);
         } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
              }
              else try {
               //sleeps for 15 minutes
               Thread.sleep(900000);
              } catch (InterruptedException e) {
               e.printStackTrace();
              }
             }
            }
    Pour l'instant la tache à réaliser est un simple println suivit d'un court sleep().

    Le problème est que le d.getHours() retourne toujours l'heure à laquelle l'appli a été lancé donc si l'appli est lancée en dehors de la plage de fonctionnement la tache n'est jamais réalisée et si l'appli est lancée dans la plage horaire définie par l'utilisateur alors la tache s'effectue tout le temps même lorsque l'heure de fin a été dépassée.

    J'ai un peu de mal à comprendre d'où vient ce problème.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Je m'avance peut-être un peu, mais je vais te dire que c'est logique, tu initialise d une seule fois et au début de ton programme, donc à chaque fois que tu fais un getHours sur d, c'est normal que ca te renvoie l'heure de départ

  3. #3
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par Magicmax
    et si l'appli est lancée dans la plage horaire définie par l'utilisateur alors la tache s'effectue tout le temps même lorsque l'heure de fin a été dépassée.
    Penser à la gestion d'un flag "boolean" indiquant si l'exécution s'est déjà déroulée pendant la plage horaire courante...
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par wichtounet
    Je m'avance peut-être un peu, mais je vais te dire que c'est logique, tu initialise d une seule fois et au début de ton programme, donc à chaque fois que tu fais un getHours sur d, c'est normal que ca te renvoie l'heure de départ
    Alors là autant pour moi, je savais pas qu'il fallait remettre à jour, mais maintenant que tu pointes le doigt la dessus, j'ai un peu honte de ne pas y avoir pensé
    Merci en tout cas, je teste tout de suite...

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d = cal.getTime();
    après mon while(true) sans plus de succès. Je suppose donc que ce n'est pas la bonne manière de mettre à jour l'objet d...

  6. #6
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Le tout ce n'est pas de mettre-à-jour une heure (ici representée par un "long"), mais de vérifier ta position horaire par rapport à l'heure courante : donc penser à faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Date maintenant = new Date(); // construite à partir de l'heure systeme (12H18)
    // meme si tu fesais un traitement de 20 minutes ici
    // la valeur de "maintenant" ne serait pas changee
    long dateHeure = maintenat.getTime(); // valeur = 12H18 (pas 12H38)
    NB: Pour info, la valeur d'une instance de "Date" et "Calendar" renvoyée par les méthodes "getTime" correspond à la valeur insérée (en création ou modification) dans ces objets !
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    D'accord je comprend mieux, la solution donc dans mon cas étant de créer un nouvel objet GregorianCalendar au début de chaque traitement.
    Merci beaucoup pour ces éclaircissements

  8. #8
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Précision : en général on utlise un "Calendar" uniquement pour calculer des dates et heures (comme ajouter 3 semaines à une date ou décaler de 15 minutes une heure...), sinon on utilise une "java.util.Date" si cette date&heure ne doit pas être changée !
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/09/2014, 17h02
  2. SecurityManager "limité" à des threads pour système de plugins
    Par SpongeBobSQP dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 24/10/2013, 23h34
  3. [QThread] Réveiller un thread
    Par snyfir dans le forum Multithreading
    Réponses: 1
    Dernier message: 28/10/2010, 11h40
  4. [C#][2.0] Réveiller un thread
    Par maitrebn dans le forum Framework .NET
    Réponses: 7
    Dernier message: 17/04/2008, 13h23
  5. appel système opendir dans thread
    Par madimane dans le forum POSIX
    Réponses: 2
    Dernier message: 14/04/2006, 05h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo