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 :

Mettre au point un TIMEOUT


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut Mettre au point un TIMEOUT
    bonjour,
    je souhaite mettre dans mon programme un sorte de timeout. Je m'explique:
    je lance une requete sur Yahoo à partir de mon programme mais je souhaite interrompre l'operation si cela dur plus de 5 secondes.

    Comment faire exactement?
    Je ne trouve pas de doc sur un eventuel TIMEOUT.

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Points : 446
    Points
    446
    Par défaut
    Il te faut regarder du côté de l'API conccurrent (présente à partir de Java 1.5). Tu y trouvera les callable et les future qui ont un timeout.

    Je n'ai pas de solution toute faite, mais je pense que c'est une bonne piste.
    Il est agréable d'avoir le choix. La difficulté est alors de faire le bon (ou le moins pire).

  3. #3
    Membre habitué Avatar de faico
    Inscrit en
    Août 2005
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 242
    Points : 179
    Points
    179
    Par défaut
    Salam,

    tu peux créer un thread pour se connecter à yahoo et un deuxième thread effectuera le contrôle, et dans le premier thread tu dois garder la date de début de l'exécution !

    c'est une idée ...

  4. #4
    Membre actif Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Points : 274
    Points
    274
    Par défaut
    j'vais peut-etre dire une connerie mais cette méthode ne marche pas ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UrlConnection.setReadTimeout(int timeout)
    (java 1.5+)
    "L'imagination est plus importante que la connaissance." - Albert Einstein.

  5. #5
    Membre habitué Avatar de faico
    Inscrit en
    Août 2005
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 242
    Points : 179
    Points
    179

  6. #6
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Merci pour toutes ces reponses.

    Mais voila, je dois m'expliquer un peu mieux car vous pensez tous que je vais mettre ca pour une URL, mais je fais plutot mettre ca dans ma class principale lorsque j'appelle une "fonction" dans une autre classe.

    Donc dans la classe principale j'instancie puis je lance une metthode retournant mes resultats de la requete.
    En gros, ca donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MesResultats = maMethodeYahoo;
    Moi je souhaite interompre comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Lancer Time;
    MesResultats = maMethodeYahoo;
    Arreter d'attendre si on depasse 5 seconde;
    Bien entendu, cela n'est pas du java c'est juste pour mieux exposer mon probleme.

    Merci encore pour vos reponses et j'attends vos nouvelles suggestions.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Tu peux lancer tes taches dans un thread, et utiliser la classe java.util.Timer pour implementer ton timeout.

  8. #8
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Avec un Thread
    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    MaClass uneTache = new MaClass();
    [...]
    Thread th = new Thread(){
        public void run(){
                  try{
                sleep(5000); // attendre 5 seconde
           }catch(Exception e){e.printStackTrace();} 
            if (uneTache.started() == false)
                  uneTache.stop();
        }
    }
    th.start();
    uneTache.start();

  9. #9
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    merci

    Mais je ne comprends pas des masses votre thread.

    Ma méthode, je la mets où?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MaClass uneTache = new MaClass();
    [...]
    Thread th = new Thread(){
        public void run(){
                  try{
                sleep(5000); // attendre 5 seconde
           }catch(Exception e){e.printStackTrace();} 
            if (uneTache.started() == false)
                  uneTache.stop();
        }
    }
    th.start();
    uneTache.start();
    uneTache.methode, c'est elle qu'il faut surveiller.

  10. #10
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    pour ma part je creereai un timer et je mettrai un mouse listener sur ta JFrame et a chaque fois qu'un evenement souris se declenche, tu réinitialise ton timer. timer.restart();

    Attention utilise bien le timer du package swing et pas celui du package util

    après ce n'est qu'une solution parmis tant d'autre...

    ++

  11. #11
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Mais la souris n'est pas une bonne solution car si l'utilisateur fait une autre tache, alors ca remet à chaque fois sont timer à Zero, non?

  12. #12
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    non l'event listener n'est que pour ton application (JFrame ici en l'occurence) donc si l'utilisateur fait autre chose sur une autre fenetre l'event listener ne sera pas declenché

  13. #13
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Faudrait nous donner un peu de code...

  14. #14
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    voila un peu de code (j'ai coupé dedans sinon ca devenait trop long):
    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 YahooRequest{
     
    	// Main permet de tester le class
    	public static  void main (String argv [])
    	{
    		//Me permet juste de tester un truc, pas important le main
    	}
     
    	static public String[][] requete(String maRecherche) {
    // J'ai effacé le code ici car pas pertinent pour vous je crois
    // Juste que ca me retourne une matrice de String
    	}
    }
    Et cette class je l'utilise comme ceci dans une autre class:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    YahooRequest request = new YahooRequest();
    resultats = request.requete(maRequeteATester);
    // resultats est un string[][]
    C'est cette derniere ligne qui pose probleme car si ca dure longtemps pour avoir un retour, je souhaite arreter cela. Je ne peux mettre le thread dans la class YahooRequest car je l'utilise aussi pour une autre class pour laquelle je ne souhaite pas de limite de temps.

    MERCI ENCORE A TOUS

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par Terminator
    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 YahooRequest{
     
    	// Main permet de tester le class
    	public static  void main (String argv [])
    	{
    		//Me permet juste de tester un truc, pas important le main
    	}
     
    	static public String[][] requete(String maRecherche) {
    // J'ai effacé le code ici car pas pertinent pour vous je crois
    // Juste que ca me retourne une matrice de String
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    YahooRequest request = new YahooRequest();
    resultats = request.requete(maRequeteATester);
    // resultats est un string[][]
    Je ne sais pas si c'est une erreur de copier/coller, mais si requete est static, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultats = YahooRequest.requete(maRequeteATester);
    suffit

    Sinon, pour le principe, il faudrait quelque chose du genre
    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
     
    public class RequeteAvecTimeout {
            String[][] resultats ;
            String requeteATester;
     
            public RequeteAvecTimeout() {
            }
     
            public execute(String requeteATester, int timeout) {
                Thread thread = new RequeteExecuteur();
                thread.start();
                try {
                   thread.join(timeout);
                } 
                catch (...) {
                  ...
                }
            }
     
            class RequeteExecuteur extends Thread {
                public void run() {
                    resultats = YahooRequest.requete(requeteATester);
               }
            }         
    }
    l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    YahooRequest request = new YahooRequest();
    resultats = request.requete(maRequeteATester);
    // resultats est un string[][]
    devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    RequeteAvecTimeout executeur = new RequeteAvecTimeout();
    executeur.execute(maRequeteATester, 5000);
    resultats = executeur.resultats;
    Il faudrait encore ajouter une protection sur l'acces concurrentiel à l'attribut resultats.

  16. #16
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Je vais pouvoir clarifier mon exemple et faire mieux.
    Avant tout, ta méthode requete() ne devrait être static
    Exécuter la fonciton main pour voir le résultat.


    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public class YahooRequest{
        boolean recu = false;
        boolean stop = false;
     
     
    	// Main permet de tester le class
    	public static  void main (String argv [])
    	{
    		YahooRequest request = new YahooRequest();
    		request.requete("", 2000); 
     
    		//Me permet juste de tester un truc, pas important le main
    	}
     
    	/* Est-ce qu'un tableau string[][] comme retour est vraiment nécessaire ?
    	 * Les container de la librairie allège le code voir ArrayList, Vector, HashTable...
    	 */
    	public String[][] requete(String maRecherche, final long timeout) {		
     
        	recu = false;    	
        	System.err.print("Recherche en cours s.v.p. attendre: "+ timeout + " ms "); 
     
        	// le Thread suivant n'est pas nécessaire. Histoire d'agrémenter l'exemple :o)
        	new Thread(){
        		public synchronized void run(){    			
        			while ((!recu) && (!stop)) {    			
    	    			try {    			
    	    				wait(100);    			
    	    			} catch (Exception e){e.printStackTrace();}
    	    			System.err.print(".");
        			}
        		}
        	}.start();
     
        	// voir autre facon créer un Thread:
            Thread th = new Thread(){
            	public synchronized void run(){
            		try{        			
            			sleep(timeout);
            		}catch(Exception e){e.printStackTrace();}
     
            		if (recu == false)
            			stop = true;
            	}
            };
            th.start();                
     
     
            synchronized(this){        
            while (!stop){ 
     
            // placer le traitement ici et verifier stop periodiquement  //
     
            }
            if (stop)
            	System.err.println("\nHors delai: " +timeout + " ms depasse");
            }	
            return null;
     
    	}
    }

  17. #17
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Excellent,

    ca fonctionne tres bien, j'ai du faire quelques arrangements, mais ca fontionne tres bien. MERCI A TOUS

  18. #18
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Je ressors ce post car apparement j'ai un souci avec ce que j'ai implementé !!

    En effet, mon thread n'est pas au point, regardez plutot:
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    public class RequeteYahoo {
    	
    	boolean recu = false;
        boolean stop = false;
    	// Main permet de tester le class
    	public static  void main (String argv [])
    	{
    		String recherche = "la mer";		
    		RequeteYahoo request = new RequeteYahoo();		
    		String[][] s = request.requete(recherche, 200);
    		
    		if (s[0][0] != null)
    		{
    			for (int j = 0; j < s.length; j++)		
    			{
    				if (s[j][0] != null )
    				{
    					System.out.println("s :" + s[j][0]);
    				}
    			}
    		}
    		else
    		{
    			System.out.println("Pas de requete");
    		}
    	}
    	
    
    	public String[][] requete(String recherche, final long timeout) {
    		recu = false;    	    
    		  Thread th = new Thread(){
    	        	public synchronized void run(){
    	        		try{        			
    	        			sleep(timeout);
    	        		}catch(Exception e){e.printStackTrace();}
    	        		
    	        		if (recu == false)
    	        			stop = true;
    	        	}
    	        };
    	        
        	
    			final int nombreResultatFixe = 10;
    			String[][] tabResultat;
    			tabResultat = new String[nombreResultatFixe][3];
    	        SearchClient client = new SearchClient("javasdktest");
    	        WebSearchRequest requete = new WebSearchRequest("\"" + recherche + "\"");
    	        int nombreResultat = 0;
    	   
    	        try 
    	        {	        	
    	        	synchronized(this)
    	        	{        
    	                if (!stop)
    	                { 
    	                    th.start();
    	                	WebSearchResults resultats = client.webSearch(requete);	                	                	
    	            
    			            // On regarde si on a assez de Resultats retournés par Yahoo (reference = nombreResultatFixe)
    			            // Si pas assez, alors on prend le nombre le resultats retourné
    			            // Si assez, alors on ne prend que les "nombreResultatFixe" resultats.
    			            //System.out.println("Resultats retournes: " + resultats.getTotalResultsReturned());	           
    			            if (resultats.getTotalResultsReturned().intValue() > 0)
    			            {
    				            if (nombreResultatFixe < resultats.getTotalResultsReturned().intValue())
    				            {	  
    				            	nombreResultat = nombreResultatFixe;
    				            }
    				            else
    				            {
    				            	nombreResultat = resultats.getTotalResultsReturned().intValue();
    				            }         
    				            	
    			            	for (int i = 0; i < nombreResultat ; i++)	            	
    				            {
    				                WebSearchResult result = resultats.listResults()[i];	               
    				               /* System.out.println("   " + (i + 1) + ": " + result.getTitle() + " - " +
    				                        result.getUrl());*/
    				                tabResultat[i][0] = result.getTitle();
    				                tabResultat[i][1] = result.getUrl();
    				                tabResultat[i][2] = result.getSummary();
    				               
    				            }
    			            }
    			            else 
    			            {
    			            	for (int i = 0; i < nombreResultat ; i++)	            	
    				            {
    				                tabResultat[i][0] = "" ;
    				            }
    			            }
    	                }
    	                if (stop)
    	                {
    	                	System.err.println("\nHors delai: " +timeout + " ms depasse");
    	                	
    	                }
    	        	}
    	        }
    	        catch (IOException e) {
    	            System.err.println("Error calling Yahoo! Search Service: " +
    	                    e.toString());
    	            e.printStackTrace(System.err);
    	        }
    	     
    	        catch (SearchException e) {	         
    	     
    	            System.out.println("error!!");
    	        }
    	        return tabResultat;
    	    }
    }
    C'est le code en gras que je dois surveiller. Si celui-ci depasse les 5 secondes, alors je dois arreter cette ligne et aller directement là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (stop)
    	                {
    	                	System.err.println("\nHors delai: " +timeout + " ms depasse");
     
    	                }
    Je pense que mon code n'est pas au point. Pourriez-vous me corriger? J'ai essayer 2/3 trucs, mais toujours rien
    D'avance merci

Discussions similaires

  1. mettre en place un timeout sur une instruction
    Par grinder59 dans le forum C#
    Réponses: 10
    Dernier message: 04/02/2009, 10h24
  2. Réponses: 0
    Dernier message: 16/08/2007, 15h12
  3. Mettre une point en exergue sur un graphique
    Par C.R.E.A.M dans le forum Excel
    Réponses: 3
    Dernier message: 02/08/2007, 15h29
  4. [C#] Impossible de mettre des points d'arrets
    Par padodanle51 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/08/2006, 15h57
  5. Comment mettre des point d'arrêt
    Par Claude l'ancien dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 23/06/2006, 11h58

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