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

Entrée/Sortie Java Discussion :

Comment interrompre un readLine ?


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comment interrompre un readLine ?
    Bonsoir,

    Voilà, mon programme a lancé un Thread qui attend sur une entrée bufferizée un message grace à readLine. Donc si rien n'arrive sur cette entrée, le server continue d'attendre.

    Ce que je voudrais ça serait que lorsque j'en ai besoin, cette attente saute et donc que je puisse passer à la suite.

    C'est possible ? Je pense que oui mais je n'ai pas trouvé comment.


    Merci pour votre aide et bonne soirée

  2. #2
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Tu peux fermer le flux.

    Je crois que cela marche également en faisant un interrupt du thread, mais cela provoque souvent la fermeture du flux, ce qui revient donc au même que la solution 1.

    Bref si tu ne veux pas fermer le flux, il n'y a pas de solutions fiables.

    Tu peux aussi passer par le paquetage nio, qui te donne plus de souplesse sur ces questions.

  3. #3
    Invité
    Invité(e)
    Par défaut
    En fait le readLine est sûr le flux d'entrée et je veux interrompre cette attente pour envoyer un message sur le flux de sortie donc c'est pas grave si le flux d'entrée se termine.

    J'ai créé une classe avec un autre Thread dont le constructeur a en paramètre l'instance de la classe où est le readLine. Ce Thread fait une boucle infinie et attend que l'utilisateur presse un bouton ce qui appelle la fonction closeFlowIn de la classe où est le flux entrant et donc le readLine.

    Apparement le readLine n'est pas stoppé car le programme ne se ferme pas, mais lorsque quelque chose arrive sur le flux d'entrée, le readLine réagit donc et ce n'est qu'après que le programme s'étend.

    Tout ça pour dire qu'apparement la méthode close() du flux (ou même la reset()) ne marche pas.

    Une autre idée ?

  4. #4
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    J'ai fait des essais, ça à l'air vrai

    Et j'ai pas d'autre idée

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    En effet les InputStream/OutputStream tout comme les Reader/Writer ne sont pas interruptible !

    Ces flux ne peuvent pas être fermé depuis un autre thread, ou plus exactement cela n'a pas d'incidence sur les méthodes bloquées (et la méthode reset() ne sert pas du tout à cela).

    Pour cela il faut utiliser les InterruptibleChannels ! Le problème c'est qu'on ne peut pas les utiliser sur n'importe quel flux : seul les fichiers et les sockets permettent de les utiliser (via la méthode getChannel() des Stream/Reader associés).


    La seule alternative (à ma connaissance) serait de vérifier si des données sont disponible AVANT chaque lecture. Le plus simple serait de se faire une classe Filter, par exemple pour InputStream :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class InterruptibleInputStream extends FilterInputStream {
     
    	public InterruptibleInputStream(InputStream stream) {
    		super(stream);
    	}
     
     
    	/**
             * Vérifie la présence de données dans le flux.
             * Cette méthode est bloquée tant qu'aucune donnée n'est disponible,
             * ou que le thread est interrompu.
             * @throws InterruptedIOException Le thread a été interrompu.
             * @throws IOException
             */
    	protected void checkAvailable() throws IOException, InterruptedIOException {
    		Thread current = Thread.currentThread();
    		while(!current.isInterrupted() && super.available()<=0) {
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				current.interrupt();
    			}
    		}
    		if (current.isInterrupted()) {
    			throw new InterruptedIOException("interrupted");
    		}
    	}
     
     
    	public int read() throws IOException {
    		checkAvailable();
    		return read();
    	}
     
    	public int read(byte[] b, int off, int len) throws IOException {
    		checkAvailable();
    		return super.read(b, off, len);
    	}
     
    	public int read(byte[] b) throws IOException {
    		checkAvailable();
    		return super.read(b);
    	}
     
    	public long skip(long n) throws IOException {
    		checkAvailable();
    		return super.skip(n);
    	}
    }
    Que l'on utilise ensuite comme ceci (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	BufferedInputStream bis = new BufferedInputStream (
    			new InterruptibleInputStream( monInputStream ) );
    	try {
     
    		// Traitement
     
    	} finally {
    		bis.close();
    	}

    La seule contrainte est que la méthode available() doit être correctement implémenté (sinon toutes les lectures seront bloqué).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bon adiGuba merci pour l'explication mais t'as seconde méthode est un peu trop compliquée pour moi et surtout j'ai pas trop le temps de refaire ma fonction là.

    Par contre heureusement pour moi c'est sur un socket que je fais le readLine.
    Je vais essayer de trouver des infos sur InterruptibleChannels et sur getChannel().

    Merci encore

  7. #7
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Par défaut Lecture de plusieurs valeurs avec readLine()
    Bonjour,
    Est-il possible d'utiliser readLine() pour lire plusieurs valeurs ?
    En 5.0, j'essaye Scanner en séparant la line d'entrée par des espaces
    useDelimiter(" ").

    Merci

  8. #8
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Par défaut
    C'est juste une erreur,
    c'était un nouveau post

    Mes excuses

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/04/2008, 15h57
  2. Comment interrompre une tâche ?
    Par kwaz73 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 16/11/2007, 12h48
  3. Réponses: 5
    Dernier message: 22/01/2007, 17h54
  4. Comment interrompre un compte à rebours ?
    Par redvivi dans le forum Linux
    Réponses: 7
    Dernier message: 04/01/2007, 09h53
  5. [javascript] comment interrompre l'exécution d'un script?
    Par r0d dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 09/11/2006, 13h01

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