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

API standards et tierces Java Discussion :

[Débutant][JavaComm] Ne pas attendre indéfiniment ?


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut [Débutant][JavaComm] Ne pas attendre indéfiniment ?
    Bonjour à tous,

    novice dans la programmation java, je me suis lancé dans un programme qui interroge via un port série (bluetooth en l'occurence) un objet distant.
    Une fois la connexion établie, il me faut obligatoirement conservée celle-ci. En m'étant inspiré de bouts de programme trouvés ça et là, je suis arrivé à établir la connexion, à interroger le mobile distant et récupérer les données transmises
    Le probléme vient du fait qu'il arrive au mobile distant de ne pas me répondre et que mon programme attend INDEFINIMENT la réponse.

    Je souhaiterais donc mettre un dispositif qui me ferait attendre la réponse qu'un temps déterminé (1 sec par exemple), que faire ? Thread ?

    un bout de mon programme :

    try {
    System.out.println(envoie + " : en cours");
    //envoie de la question
    outStream.write(envoie.getBytes());
    //lecture de la réponse <--- le problème !
    recu = (String) bufRead.readLine();
    ...


    Merci. Mat

  2. #2
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    une solution serait d'attendre la réponse dans un thread séparé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Principale {
     
        public static void main(String[] arg) {
     
            //Lancement de l'écouteur
            Ecouteur e = new Ecouteur();
            e.start();
     
            //envoie de la question 
            outStream.write(envoie.getBytes()); 
        }
    }

    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
     
    public class Ecouteur extends Thread {
     
     
        public Ecouteur() {
     
            //...
        }
     
        public void run() {
     
            while(true) {
     
                String recu = (String) bufRead.readLine(); 
            }
        }
     
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut
    merci pour la réponse.
    Toutefois je ne comprends pas en quoi je pourrais régler mon pb d'attente sans fin. Comment puis-je spécifier un temps d'éxécution du thread e ?

  4. #4
    Membre éclairé Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Par défaut
    Citation Envoyé par matsfr
    merci pour la réponse.
    Toutefois je ne comprends pas en quoi je pourrais régler mon pb d'attente sans fin. Comment puis-je spécifier un temps d'éxécution du thread e ?
    ben dans un thread tu peux le laisser attendre indéfiniment vu qu'il attend en parallèle de ton programme principale...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut
    cela me semble quelque peu ardu car cela soulève d'autres pbs : qu'est ce qui va se passer lorsque je vais émettre à nouveau sur le même port ?
    Je considére en effet l'attente infinie comme une erreur que je veux rapporter à l'utilisateur.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Par défaut
    Grâce aux indices de saod, j'ai résolu mon problème.
    En voici le code.

    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
     
    DANS LA CLASSE PRINCIPALE
    try {
    					System.out.println(envoie + " : en cours... (tentative " + (i+1) + "/3)");
     
    					int tempschrono = 4000; //en millisecondes
     
    					//définition de la thread Ecouteur
    					Ecouteur thread1 = new Ecouteur(bufRead);
    					//démarrage de la thread Ecouteur
    					thread1.start();
     
    					//envoie de la question
    					outStream.write(envoie.getBytes());
     
    					//attendre la fin du chrono avant de comparé les valeurs
    					sleep(tempschrono); 
     
    					//test de la réponse : les 4 premiers caractères doivent être identiques
    					if (test((String)envoie.substring(0,4), (String)Ecouteur.recu.substring(0,4))) {
    						i = 3; 
    						valider = true;						
    					} else {
    						valider = false;
    					}
    				} catch (IOException e) {}
    				  catch (InterruptedException e) {}
    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
     
    DANS UNE CLASSE A PART
    public class Ecouteur extends Thread { 
    	static public String recu;
    	private BufferedReader bufRead;
        public Ecouteur(BufferedReader bufferRead) { 
     
        	bufRead = bufferRead; 
        } 
     
        public void run() { 
     
            while(true) { 
            	try {
            		recu = (String) bufRead.readLine();
            		System.out.println("reception : " + recu);
    			} catch (Exception e) {
    				// TODO: handle exception
    			}
            } 
        } 
     
    }
    Maintenant à la fin de mon "tempschrono", si je n'ai pas de réponse, je passe à la tentative de comm suivante. exactement ce que je voulais...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/07/2006, 17h14
  2. Réponses: 10
    Dernier message: 22/06/2006, 14h10
  3. Réponses: 2
    Dernier message: 13/06/2006, 10h52
  4. [Débutant] fichier .class pas trouvé par tomcat!!!
    Par oussam dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/03/2006, 15h31
  5. [W3C] [Débutant] Une erreur pas vraiment clair !
    Par almisuifre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/10/2005, 06h35

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