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

Langage Java Discussion :

comment arrêter un programme qui tourne en boucle


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Points : 28
    Points
    28
    Par défaut comment arrêter un programme qui tourne en boucle
    J'ai créé un programme qui permet de récupérer des données par liaison série.

    Seulement je ne sais pas comment arrêter une boucle while qui récupère des readLine. L'appareil n'a pas de caractère de fin.

    Avant le programme utilisé pour récupérer les données était l'hyperterminal de windows.

  2. #2
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Salut,
    c'est un programme en mode console? une IHM?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Points : 136
    Points
    136
    Par défaut
    Salut,

    Je ne sais pas si ça correspond à ta question, mais dans le cas d'un BufferedReader la méthode readLine() renvoie null quand elle atteint la fin du flux

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Points : 28
    Points
    28
    Par défaut re
    J'ai d'abord essayé de faire un while avec comme condition != null mais ça boucle sans arrêt. Après j'ai réalisé que l'hyperterminal que j'utilisais jusque là n'avait pas de fin non plus.

    En fait il s'agit d'un appareil qui enregistre des données toutes les minutes et qui peut les envoyer lorsqu'on appuie sur une touche.

    Il ne peut pas y avoir de caractère de fin puisqu'il rajoute tout le temps des données.

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    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 084
    Points : 7 995
    Points
    7 995
    Par défaut
    Mets ta boucle dans un Thread.

    Tu pourras peut etre eventuelement utiliser interrupt pour tuer le thread et donc quitter la boucle.

    Mais il y'a problement plus propre comme solution.
    (J'ai fait la meme chose avec des operation socket bloquantes que je voulais pouvoir arreter a tout moment et je n'ai jamais eu de soucis jusque la)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 44
    Points : 28
    Points
    28
    Par défaut
    Ok je vais voir comment on utilise un Thread. J'en ai pas encore utilisé.

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    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 084
    Points : 7 995
    Points
    7 995
    Par défaut
    En theorie, tu ne devras pas changer grand chose, cela devrait aller vite.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 856
    Points
    1 856
    Par défaut
    Si le flux n'est jamais fermé par l'appareil, il est logique que votre boucle continue indéfiniment. A quel moment et pourquoi souhaitez vous que votre boucle s'arrête?

  9. #9
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Je suis dans le meme cas, je commande un carte electronique qui me renvoyer des données toute les 4ms environ.
    En faisant un while avec un readline()!=null comme condition d'arrete... ca ne s'arrete que lorsque la carte est arrete (en gros on coupe l'alim). Donc je te conseille de mettre la lecture des donné de ton appareil dans un thread (ca c'est facile a faire) et en plus du readline comme condition d'arret tu ajoute une autre condition dans un "ou" pour qu'il test en plus que tu decide pas d'une facon ou d'une autre de l'arreter.
    Dans mon cas bien particulier, je stock les données "lues" depuis mon thread dans un Vector (qui est synchronisé) et je vide se meme vector au fait et a mesure que je traite ces données. Le seul probleme que je rencontre c'est que si je charge un peu trop de processus mon vector se rempli plus vite qu'il ne se vide du coup au bout d'un moment c'est l'out of memory (en meme temps je traite 15000 trame de données par minute).
    En ce qui me concerne j'ai un gros volume de données mais si tu en a moins ca devrai pas pauser de soucis.

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    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 084
    Points : 7 995
    Points
    7 995
    Par défaut
    et en plus du readline comme condition d'arret tu ajoute une autre condition dans un "ou" pour qu'il test en plus que tu decide pas d'une facon ou d'une autre de l'arreter
    Tout depend si la boucle tourne indefiniment ou si il y'a blocquage sur le ReadLine. Dans le premier cas ta solution va marcher dans le 2 eme, pas il me semble.

  11. #11
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Je suis un boulet, en fait c'est un ET et pas un ou pour ta condition d'arrete du while genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String Lecture;
    BufferedReader fluxLecture;
    boolean isArreter=false;
    ...
    while((lecture=fluxLecture.readLine())!=null && !isArreter){
    //code à executer...
    }
    Et tu fais, par exemple, un bouton arreter qui mets isArreter a true qd tu veux arreter l'execution de la boucle while.
    note: ne pas oublier de fermer le fluxLecture

  12. #12
    Membre régulier Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Points : 82
    Points
    82
    Par défaut
    En effet, je pense que si ton appareil n'arrête pas d'envoyer des données, alors c'est toi qui doit savoir quand est-ce que tu voudrais arrêter de lire les données de ta liaison série.
    ça peut être lorsque l'utilisateur clique sur le bouton arrêter ou autre chose dans le genre.
    Pour cela, tu peux écrire une boucle qui ne se terminera que lorsqu'on atteint la fin de fichier (readLine() == null) ou lorsque une variable d'état passe à false (again == false).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((line = readLine()) != null || again ) {....}
    Une fois cette boucle écrite, tu devra donc écrire une méthode setter, qui te permettra de modifier l'état de cette variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setAgain(boolean again){ this.again = again; }
    Voila!!

  13. #13
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    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 084
    Points : 7 995
    Points
    7 995
    Par défaut
    Citation Envoyé par yashiro Voir le message
    Pour cela, tu peux écrire une boucle qui ne se terminera que lorsqu'on atteint la fin de fichier (readLine() == null)
    Oui sauf qu'il nous a bien dit au dessus qu'il n'y avait jamais de fin de fichier. Donc pour moi il n'y aura jamais de null qui retourne de readline.
    Forcement on va rester bloquer sur le ReadLine() donc je ne vois pas comment debloquer la situation.

    Mais je me trompe peut etre...

Discussions similaires

  1. comment faire un programme qui calcul la somme ?
    Par jahjouna dans le forum C++
    Réponses: 18
    Dernier message: 13/12/2006, 00h33
  2. Réponses: 3
    Dernier message: 30/09/2006, 09h36
  3. Réponses: 4
    Dernier message: 31/05/2006, 15h00
  4. Réponses: 1
    Dernier message: 19/12/2005, 13h00
  5. Pb de rand() qui tourne en boucle
    Par MadChris dans le forum MFC
    Réponses: 3
    Dernier message: 26/06/2004, 16h24

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