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

Java Discussion :

exécuter un thread pendant une période déterminée


Sujet :

Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut exécuter un thread pendant une période déterminée
    Bonjour,

    Alors voila j'aimerais exécuter un thread pendant une période déterminée (10 minutes dans mon cas) puis le fermer.

    Ceci me permettrait ainsi de permettre au thread de se fermer s'il devait rencontrer une erreur, un bug qui le bloquerait. En effet, mon thread est normalement censé fonctionner uniquement pendant une courte durée de 2 à 3 minutes.

    J'ai déjà fait des recherches à ce niveau là, j'ai regardé du côté des Timer() et il semblerait que le Timer() puisse gérer cela mais je n'ai pas compris comment l'utiliser si en effet il le peut.

    Merci de m'aider .

    Andréas

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Raiden1234 Voir le message
    Alors voila j'aimerais exécuter un thread pendant une période déterminée (10 minutes dans mon cas) puis le fermer.
    Un thread doit se terminer par lui même...

    Citation Envoyé par Raiden1234 Voir le message
    Ceci me permettrait ainsi de permettre au thread de se fermer s'il devait rencontrer une erreur, un bug qui le bloquerait. En effet, mon thread est normalement censé fonctionner uniquement pendant une courte durée de 2 à 3 minutes.
    Quels sont les raisons qui pourrait le bloquer ? Il faut plus d'info sur ton thread

    Citation Envoyé par Raiden1234 Voir le message
    J'ai déjà fait des recherches à ce niveau là, j'ai regardé du côté des Timer() et il semblerait que le Timer() puisse gérer cela mais je n'ai pas compris comment l'utiliser si en effet il le peut.
    Un Timer permet simplement d'exécuter une tâche à intervalle régulier. C'est peut être possible de les utiliser pour cela mais il y a sûrement une meilleure solution... mais il faudrait savoir ce que fait ton thread

    a++

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    En fait mon thread va exécuter un programme exécutable (iMacro) qui va en gros scanner un site internet. Le thread va ensuite fermer le programme lorsqu'il aura fini de scanner le site internet et se terminer lui-même.

    Cependant il peut s'avérer dans certains cas, que le programme iMacro plante (erreur windows où l'on peut envoyer un rapport..) ainsi mon thread n'atteint jamais un état déterminé connu qui peut être le succès (iMacro a finit) ou un echec (iMacro renvoie un erreur car une de ses commandes a échouée).

    Mon thread va toujours être en fonctionnement normal sans se rendre compte que le programme iMacro n'arrive plus à progresser. C'est un plantage trop sérieux pour que iMacro lui même puisse renvoyer un état "échec" connu à mon thread.

    Cette situation arrive rarement mais il faut néanmoins que je la gère, c'est pour cela que je dois fixer un durée limite pour l'exécution de mon thread, pour qu'il puisse continuer avec un autre site (mon thread doit en effet traiter ainsi une liste de sites internet un par un).

    Voila, si certains aspects ne sont pas clairs, dites-le moi et j'essaierais de reformuler mon explication .

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 085
    Points : 8 004
    Points
    8 004
    Par défaut
    Citation Envoyé par Raiden1234 Voir le message
    Cette situation arrive rarement mais il faut néanmoins que je la gère, c'est pour cela que je dois fixer un durée limite pour l'exécution de mon thread, pour qu'il puisse continuer avec un autre site (mon thread doit en effet traiter ainsi une liste de sites internet un par un).
    Et si ton iMacro mets enormement plus de tempsque ton TIMER (site plus gros qu'un autre) et qu'en fait il ne plante pas mais depasse le timer, tu vas considerer que ca a raté ?! Ou pire attendre 20 minutes alors que le truc a planté depuis 20 minutes ?!

    Si tu utilisais un autre programme que "iMacro" genre un en console, qui pourrait te renvoyer un code d'erreur sans te caller par une boite de dialogue (a ce que je comprends dans ton cas).

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    L'utilisation d'iMacro est obligatoire. Je n'ai vraiment pas le choix à ce niveau là.

    L'erreur que j'aimerais traiter est une erreur windows. Sachant que je suis dans l'obligation d'utiliser le programme "iMacro", je ne vois pas d'autres alternative que de jouer sur le temps.

    C'est un programme qui est fait pour tourner toute une nuit, je n'en suis donc pas à 20 minutes prêt.

    Un site ne peut pas durer plus de 10 minutes tout en restant dans un état de "bon" fonctionnement. iMacro gère un timeout pour traiter les ralentissements éventuels du site (60 secondes). Dans tous les autres cas d'erreur que celui que j'aimerais traiter, iMacro pourra renvoyer un code d'erreur lié au timeout.

    Cette erreur windows est si persistente qu'elle empèche iMacro de la traiter à travers son timeout.

    Donc en gros, sans vouloir compliquer les choses car ce n'est pas l'objet de mon sujet, si une inactivité (pas de réponses données à mon programme) est supérieure à 60 secondes, alors je me trouve dans l'erreur windows. Et c'et à mon thread de traiter cette inactivité.

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    Personne ne sait??

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas un thread mais un process...

    Un simple appel à la méthode destroy() devrait suffire à le tuer !

    a++

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 085
    Points : 8 004
    Points
    8 004
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ce n'est pas un thread mais un process...

    Un simple appel à la méthode destroy() devrait suffire à le tuer !

    a++
    A mon avis, pour qu'il dise cela, c'est probablement qu'il fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Thread t = new thread()
    {
     run()
     {
       Process p = null; 
       Runtime rt = Runtime.getRuntime(); 
       p = rt.exec("iMacro.exe ....");
      ....
     }
    }
    Me tromps-je Raiden ?

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ben justement : il n'y a qu'un sleep() et un destroy() à rajouter...

    a++

    PS : J'espère au moins que les flux d'E/S sont correctement traité... car le problème pourrait venir de là !

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par wax78 Voir le message
    A mon avis, pour qu'il dise cela, c'est probablement qu'il fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Thread t = new thread()
    {
     run()
     {
       Process p = null; 
       Runtime rt = Runtime.getRuntime(); 
       p = rt.exec("iMacro.exe ....");
      ....
     }
    }
    Me tromps-je Raiden ?
    En effet c'est de ce style là, bien que ce ne soit pas moi qui vais directement lancer les commandes exec et destroy, j'utilise tout un environnement Java (fournit avec IMacro) qui va s'occuper de lancer l'IMacro et de le fermer correctement.

    Donc oui je créé un thread qui va boucler sur plusieurs sites et pour chaque site va lancer IMacro et le fermer à la fin.

    Citation Envoyé par adiGuba Voir le message
    Ben justement : il n'y a qu'un sleep() et un destroy() à rajouter...

    a++

    PS : J'espère au moins que les flux d'E/S sont correctement traité... car le problème pourrait venir de là !
    J'ai finalement réussi à faire en regardant du côté du TimerTask qui me permet d'arrêter mon Thread après 15 minutes.

    Voici le code associé pour information :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    long temps = 900000;                      
    Timer timer = new Timer();          
    TimerTask tache = new TimerTask() {    
            @Override
            public void run() {
    	           halt();          // arrêt du thread 		 
            }
    };
    timer.schedule(tache,temps);
    C'était vraiment simple en fait

    Merci beaucoup pour vos aides et pistes de solutions !

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

Discussions similaires

  1. Déclencher action pendant une période donnée
    Par Detoussay dans le forum Langage
    Réponses: 15
    Dernier message: 03/01/2014, 10h04
  2. exécuter un thread pour une durée donnée
    Par selmani300 dans le forum C
    Réponses: 6
    Dernier message: 28/04/2009, 14h44
  3. sélectionner des évènement que pendant une période temps donnée
    Par jenniferIUP dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/02/2009, 15h05
  4. Executer du code pendant une durée déterminé
    Par vladimire dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 21/12/2008, 12h32
  5. Réponses: 9
    Dernier message: 24/08/2007, 13h37

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