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

avec Java Discussion :

Arrêter un thread grâce à une commande clavier


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Arrêter un thread grâce à une commande clavier
    Bonjour,

    Je travaille en Java depuis peu de temps, et je suis amené a faire un programme qui doit inclure des threads. J'ai fouillé le web, et je peine à trouver ce que je veux... J'espère cependant que mon problème n'est pas déjà référencé quelque part.
    Voici mon problème :
    J'ai écrit le plus gros de mon programme qui s'occupe de mettre à jour une base de données en fonction de dates de modification de fichier. Mais là n'est pas le problème... Je voudrais pouvoir faire en sorte que ce programme soit lancé automatiquement toutes les 10 minutes par exemple, de manière à mettre à jour mes bases régulièrement. Enfin, il faudrait pouvoir sortir du programme grâce à une commande clavier.

    La première solution que j'avais trouvée était un timer. Cela me permettait d'entrer ma commande d'arrêt au clavier. Mais j'ai eu un souci avec cette solution, je m'explique :
    Au départ, j'avais fait une erreur sur mon setter, qui mettait systématiquement la variable quitter à "q", au lieu de la chaine rentrée au clavier. De cette manière, n'importe quel caractère arrêtait le processus au moment de la comparaison entre la variable quitter et "q". Lorsque j'ai modifié le setter, même en tapant "q", le programme continuait à tourner...


    Voila... Quelle structure me conseilleriez vous ? Je n'ai pas de code à vous proposer, j'ai testé quelques trucs trouvés à droite et à gauche, mais rien de très probant...

    Je vous remercie !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu veux appeler une méthode toutes les 10 minutes ou, comme le dit ton message, lancer ton programme toutes les 10 minutes? Parce que ce n'est pas du tout la meme chose.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ah oui en effet ça fait une belle différence ! Je ne m'étais pas posé la question de cette manière, mais je suppose que ce serait appeler la méthode à intervalles réguliers...
    Merci pour la réponse rapide en tous cas !

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un timer est effectivement une solution. une autre plus complexe à mettre en oeuvre (tout dépend de la complexité de l'application) ce sont des librairies comme Quartz qui font déjà ce genre de choses.

    Pour ce qui est du clavier: ben faudrait le code si vous voulez qu'on vous corrige

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 48
    Points
    48
    Par défaut
    Personnellement je te conseillerais de passer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    scheduledExecutorService.scheduleAtFixedRate(tonTraitement,0,10, TimeUnit.MINUTES);
    //arrêt de l'executeur
    scheduledExecutorService.shutdown();
    cf la javadoc de ScheduledExecutorService

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses,

    Tchize : Je vais essayer de retrouver le code que j'avais, mais ca ne devrait pas être très compliqué

    ninow : je vais regarder cette possibilité...

    Merci à tous les 2 !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Hello,
    je reviens vers vous après ce jour férié

    J'ai étudié la solution de ninow, qui me semble assez appropriée. J'ai trouvé un bon exemple sur le net, que j'ai tenté d'adapter, et ça fonctionne plutôt bien pour répéter des méthodes. La dernière chose qu'il me manque, c'est un moyen de l'arrêter manuellement... Est-ce possible ?
    voici le code qui fonctionne bien pour la boucle. Par contre, mes tentatives de le bloquer par une commande clavier restent infructueuses... Si vous avez des éléments de réponse pour moi, ce serait vraiment top.

    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
     
    public class Test_beeper {
     
     
         private final ScheduledExecutorService scheduler =
           Executors.newScheduledThreadPool(1);
     
        public void beepForAnHour() {
            final Runnable beeper = new Runnable() {
                    public void run() { System.out.println("beep"); }
                };
            final ScheduledFuture<?> beeperHandle =
                scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
            scheduler.schedule(new Runnable() {
                    public void run() { beeperHandle.cancel(true); }
                }, 60 * 60, SECONDS);
        }
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
     
            Test_beeper beep= new Test_beeper();
            beep.beepForAnHour();
     
     }
     
    }

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par lodesse Voir le message
    Par contre, mes tentatives de le bloquer par une commande clavier restent infructueuses...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scheduler.shutdownNow();

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai également trouvé cette méthode dans mes recherches, la seule chose c'est qu'il faut qu'elle se déclenche uniquement lorsque l'utilisateur va taper "quit" par exemple.
    J'avais testé avec un Scanner : ça donne la main à l'utilisateur. Le problème c'est que ça bloque le processus tout le temps que rien n'est saisi...

    Excusez mon ignorance... et merci pour votre aide

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben non ca bloque que le thread qui fait l'appel à Scanner

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    aaaah ok je comprends un peu mieux... je re-teste et vous tiens au courant !!

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    C'est parfait !!!
    Super je vais pouvoir terminer ce projet, c'est au poil !!!

    Merci beaucoup pour l'aide rapide, constructive... je reviendrai

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

Discussions similaires

  1. Exécuter une commande linux dans X threads en parallèle
    Par sanchou dans le forum Général Java
    Réponses: 8
    Dernier message: 23/04/2008, 14h02
  2. Comment arréter un thread qui exécute une instruction bloquante
    Par nibor2luxe dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 28/02/2008, 17h03
  3. [.NET] envoyer une commande clavier à une application
    Par tlemcenvisit dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 14/09/2007, 15h45
  4. Réponses: 1
    Dernier message: 07/12/2006, 22h41
  5. Arrêter proprement le thread d'une JFrame
    Par fabrisss dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 04/12/2006, 12h32

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