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 :

Créer un timer qui limite le temps de réponse


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Créer un timer qui limite le temps de réponse
    Bonjour,


    Je souhaite créer un timer limitant le temps de réponse dans un code destiné à interroger l'utilisateur.
    Après un certain temps on passe à la question suivante.
    Je n'y parviens pas... Help

    J'ai bien trouvé ce code mais je n'arrive pas à l'insérer dans ma classe "examiner"

    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
    import java.util.Timer;
    import java.util.TimerTask;
     
     
    public class TimerPerso {
     
     
        public static void main(String[] args) {
     
     
            long temps = 2000;                      // délai avant de répéter la tache : 2000 = 2  seconde
            long startTime = 0;                    // délai avant la mise en route (0 demarre immediatement)
            Timer timer = new Timer();             // création du timer
            TimerTask tache = new TimerTask() {     // création et spécification de la tache à effectuer
                @Override
                    public void run() {
                        System.out.println("salut");    // ici se qui doit être effectué
                    }
            };
            timer.scheduleAtFixedRate(tache,startTime,temps);  // ici on lance la mecanique
     
            }
     
    }
    Il faudrait qu'à chaque itération, le temps soit limité.
    Voici le code de ma classe:

    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
    public void examiner(int nb) {
    	Scanner sc=new Scanner(System.in);
    	créerExamen();
    	for (int i=1;i<nb+1;i++) {
    		Random r = new Random(0,9);
    		int multi = r.getRandom();
    		Random rnd = new Random (0,table);
    		int rndTable= rnd.getRandom();
    		this.afficherExamen(multi, rndTable);
    		int rep=sc.nextInt();
    		if (rep==(multi+1)*(rndTable+1)) {
    			System.out.println("Bravo!");}
    		else {
    			System.out.println("Dommage! La bonne réponse était "+(multi+1)*(rndTable+1));
    		}
    	}
    	sc.nextLine();
    	System.out.println("");
    	System.out.println("Terminé!");
    }

    Merci d'avance!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le souci pour faire de genre de chose est surtout que la lecture clavier sur l'entrée standard est bloquante : dès qu'on appelle une méthode du type nextxxx ou hasnextxxx on bloque le thread qui l'appelle. Donc toute tentative de l'interrompre par timer ou autre est problématique, voire impossible.
    Par timer, c'est assez complexe parce qu'il faudrait mettre en place tout un système d'observable et de boucle d'attente. Ce système est déjà procuré par les exécuteurs (ExecutorService) et les Future/FutureTask.

    On peut faire quelque chose comme ça (vite fait, pas sûr que ça soit totalement fonctionnel et optimisé) et tu peux voir que c'est déjà assez "usine à gaz" :
    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
    public class TimeoutScanner implements AutoCloseable {
     
    	private final ExecutorService executor = Executors.newSingleThreadExecutor();
    	private final BufferedReader reader;
    	private final InputStream is;
     
    	public TimeoutScanner() {
    		this.is=System.in;
    		this.reader = new BufferedReader(new InputStreamReader(System.in));
    	}
     
    	@Override
    	public void close() {
    		executor.shutdownNow(); // arrêt de l'exécuteur sans attendre que les tâches en cours soient terminées
    	}
     
    	public Optional<String> readline(int timeout, TimeUnit timeunits) {
    		AtomicBoolean stop = new AtomicBoolean(); // permet d'arrêter la boucle de lecture lors d'une exception
    		FutureTask<String> readline = new FutureTask<>(()-> {
    			boolean ok=false; // vrai si on a lu une ligne, faux sinon
    			String response=null;
    			do {
    				if ( reader.ready() && !stop.get() && !Thread.currentThread().isInterrupted() ) { // on ne lit que s'il y a quelque chose à lire et qu'on a pas annulé la lecture
    						response = reader.readLine(); // on lit
    						ok=true; // on dit qu'on a lu
    				}
    			} while( !ok && !Thread.currentThread().isInterrupted()); // tant qu'on a pas lu et qu'on a pas 
    			return response;
    		});
     
    		executor.submit(readline); // lance la tâche
    		try {
    		    return Optional.of(readline.get(5, TimeUnit.SECONDS));
    		} catch (InterruptedException | ExecutionException | TimeoutException e) {
    			readline.cancel(true); // force l'annulation de la tâche
    			stop.set(true); // pour éviter de commencer à lire et bloquer le thread alors qu'on a annuler
    			try {
    				while ( is.available()>0 ) reader.read(); // vide le tampon (si l'utilisateur à commencer à taper sans faire entrée)
    			} catch (IOException e1) {
    			}
    		    return Optional.empty();
    		} 
     
    	}
     
    	public Optional<Integer> readInteger(long timeout, TimeUnit timeunits, String errorMessage) {
     
    		AtomicBoolean stop = new AtomicBoolean();
    		FutureTask<Integer> readline = new FutureTask<>(()-> {
    			boolean ok=false;
    			Integer response=null;
    			do {
    				if ( reader.ready() && !stop.get() && !Thread.currentThread().isInterrupted() ) {
    					try {
    						response = Integer.valueOf(reader.readLine());
    						ok=true;
    					}
    					catch(NumberFormatException e) {
    					    System.out.println(errorMessage);
    					}
    				}
    			} while( !ok && !Thread.currentThread().isInterrupted());
    			return response;
    		});
     
    		executor.submit(readline);
    		try {
    		    return Optional.of(readline.get(5, TimeUnit.SECONDS));
    		} catch (InterruptedException | ExecutionException | TimeoutException e) {
    			readline.cancel(true);
    			stop.set(true);
    			try {
    				while ( is.available()>0 ) reader.read();
    			} catch (IOException e1) {
    			}
    		    return Optional.empty();
    		} 
     
     
    	}
     
    	public static void main(String[] args) {
     
    		try(TimeoutScanner reader = new TimeoutScanner()) {
     
    			System.out.println("Vous avez 5 secondes pour taper votre texte...");
    			Optional<String> text = reader.readline(5, TimeUnit.SECONDS); // lit une chaîne au clavier en attendant max 5 secondes
    			if ( text.isPresent() ) { // si une saisie a été effectuée
    				System.out.println("Votre saisie : " + text.get()); 
    			}
    			else { // si aucune saisie n'a été effectuée
    				System.out.println("Trop tard");
    			}
     
     
    			System.out.println("Vous avez 5 secondes pour taper un nombre...");
    			Optional<Integer> value = reader.readInteger(5, TimeUnit.SECONDS, "Un nombre on vous a dit !!!");
    			if ( value.isPresent() ) {
    				System.out.println("Votre saisie : " + value.get());
    			}
    			else {
    				System.out.println("Trop tard");
    			}
     
    		}
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Salut,


    Et merci pour la réponse.
    Beaucoup de choses que je ne connais pas encore donc normal que je sois limité ici.
    J'essaye de compiler avec ton code mais j'obtiens 2 erreurs sur les lignes de Multi Catch 34 et 69.



    "Multiple markers at this line
    - TimeoutException cannot be resolved to a type
    - ExecutionException cannot be resolved to a type
    - No exception of type Object can be thrown; an exception type must be a subclass of
    Throwable"

    Juste pour info, tu codes depuis combien de siècles?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jeanfils Voir le message
    J'essaye de compiler avec ton code mais j'obtiens 2 erreurs sur les lignes de Multi Catch 34 et 69.
    Je n'ai pas mis les imports dans mon exemple . Les as-tu bien ajoutés ?
    Citation Envoyé par jeanfils Voir le message
    Juste pour info, tu codes depuis combien de siècles?
    Mmfff, ça fait longtemps que je ne compte plus
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Je n'ai pas mis les imports dans mon exemple . Les as-tu bien ajoutés ?
    Oui j'ai tout importé ce qui était importable.
    Enfin, je pense...

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Voici les imports au cas où il t'en manquerait (ou tu n'aurais pas les bons) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Optional;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    import java.util.concurrent.atomic.AtomicBoolean;
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Voici les imports au cas où il t'en manquerait (ou tu n'aurais pas les bons) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Optional;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    import java.util.concurrent.atomic.AtomicBoolean;
    Effectivement il me manquait les 2 imports d'Exception.
    Merci, je vais essayer de l'implémenter dans mon code.

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Il y a deux nouvelles méthodes en JDK 9 pour la classe CompletableFuture qui pourraient peut-être t'intéresser:

    *) completeOnTimeout​(T value,long timeout,TimeUnit unit)

    *) orTimeout​(long timeout, TimeUnit unit)

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bah non, ça ne change rien au problème de la lecture clavier dans la console...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/08/2012, 00h41
  2. Fonction qui dure le temps de dialog ?
    Par CORREGE Frédéric dans le forum MFC
    Réponses: 6
    Dernier message: 21/02/2004, 16h39
  3. [][Timer] Créer un Timer sans utiliser le composant
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/10/2003, 11h04
  4. Réponses: 2
    Dernier message: 26/09/2003, 16h49
  5. [debutant]Limiter le temps de saisi
    Par Nasky dans le forum C
    Réponses: 5
    Dernier message: 17/03/2003, 15h47

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