comment mettre en pause un programme pendant son exécution ?

comment mettre en pause un programme pendant son exécution ? - Java - Programmation

Marsh Posté le 14-11-2003 à 15:37:17    

Bonjour,
 
je souhaiterais faire un petit test : du genre je pose une question et l'utilisateur répond par oui avec la touche 'o' et par non avec 'n'.
 
Dans ce petit test, le temps de présentation des questions est important, tout comme le temps de reaction de l'utilisateur...
 
Mon probleme est le suivant :
 
J'ai un tableau 2d contenant dans une case la question, puis dans l'autre case la reponse.
Donc je fais une boucle répétant autant de fois qu'il y a de question :
 
- une présentation de la question a l'utilisateur pendant 1s (là j'utilise un Thread().sleep(1000)), puis on mesure le temps de réaction de l'utilisateur...  
-----------------------------------------------------------------
-> là je ne sait pas trop comment faire, il faut que je lance un Thread qui incrémente un entier toutes les millisecondes
un truc genre :
 
public void run() {
for(;;) {   try{sleep(1);}  
            catch (InterruptedException e) {}
            _ms++;
}
 
=> mais comment faire pour stopper le Thread lorsque l'utilisateur frappe sur une touche('o' ou 'n') ? En mettant un booleen à tester en début de run ?
----------------------------------------------------------------
 
- et enfin j'aimerais savoir comment pourrai-je stopper mon programme avant d'afficher la question suivante, tant que l'utilisateur n'a pas appuyé sur une touche ("entrée" par exemple) ? Est-ce qu'il n'y aurait pas une méthode permettant d'attendre une pression de touche avant de continuer (genre : waitKey()) ??
 
J'espère que ce que j'ai écrit est compréhensible.
Je remercie d'avance ceux qui pourront m'aider...
 
                                     Baba

Reply

Marsh Posté le 14-11-2003 à 15:37:17   

Reply

Marsh Posté le 14-11-2003 à 15:46:58    

tu peux pas simplement prendre l'heure ou quoi quand tu affiches la question puis quand il répond => le temps de réaction est donc la différence des deux


---------------
oui oui
Reply

Marsh Posté le 14-11-2003 à 15:48:56    

GUI powwa
 
 
sinon t'as readLine(); qui  "attend" que l'utilisateur ai saisie quelque chose pour continuer l'execution du programe.

Reply

Marsh Posté le 14-11-2003 à 15:51:32    

c'est vrai que c'est pas mal comme truc, je n'y avait même pas pensé, mais de toute façon avec mon Thread et un booleen j'arrive à avoir le temps de réaction.
 
Mais tu ne sait pas comment est-ce que je peut mettre mon programme "en pause" en attendant que l'utilisateur appuie sur une touche : genre tu affiche "press any key to continue" dans un pannel, et hop le programme reprend son cours quand l'utilisateur appuie sur une touche ?

Reply

Marsh Posté le 14-11-2003 à 15:52:18    

je vais tester ton truc veryfree...

Reply

Marsh Posté le 14-11-2003 à 16:21:23    

babthefox2002 a écrit :

c'est vrai que c'est pas mal comme truc, je n'y avait même pas pensé, mais de toute façon avec mon Thread et un booleen j'arrive à avoir le temps de réaction.
 
Mais tu ne sait pas comment est-ce que je peut mettre mon programme "en pause" en attendant que l'utilisateur appuie sur une touche : genre tu affiche "press any key to continue" dans un pannel, et hop le programme reprend son cours quand l'utilisateur appuie sur une touche ?


 
dans un pannel ??
 
jcroyait que c'etait en console :o

Reply

Marsh Posté le 14-11-2003 à 17:55:55    

non veryfree relis son post...
bab ton truc avec le thread c'est horrible, tu appelles sleep mille fois par seconde...
 
en console je ne sais pas du tout comment faire du on-the-fly (press a key) car il me semble que les données sont envoyé dans le stream qu'apres un Enter...
 
long a = System.currentTimeMillis();
// question, réponse
long b = System.currentTimeMillis();
System.out.println("vous avez mis " + (b-a)/1000 + " secondes à répondre" );

Reply

Marsh Posté le 14-11-2003 à 18:11:41    

bugsan a écrit :

non veryfree relis son post...
bab ton truc avec le thread c'est horrible, tu appelles sleep mille fois par seconde...
 
en console je ne sais pas du tout comment faire du on-the-fly (press a key) car il me semble que les données sont envoyé dans le stream qu'apres un Enter...
 
long a = System.currentTimeMillis();
// question, réponse
long b = System.currentTimeMillis();
System.out.println("vous avez mis " + (b-a)/1000 + " secondes à répondre" );


 
de quoi non  :heink:  
un coup c'est en console, un autre coup il parle de panel  :o  
j'essaye de comprendre quoi [:spamafote]

Reply

Marsh Posté le 15-11-2003 à 14:48:17    

Mes questions sont affichées dans un JPanel a l'aide de la methode "paintComponent(Graphic g)"...
 
Mais je crois quavec un objet Date() et la méhode getTime) je vais pouvoir men sortir au pire...
 

Reply

Marsh Posté le 15-11-2003 à 14:50:17    

en fait pour le "press any key", je cherche l'équivalent d'un getChar() en langage C, je ne sais pas s'il existe en java ?

Reply

Marsh Posté le 15-11-2003 à 14:50:17   

Reply

Marsh Posté le 15-11-2003 à 15:32:25    

En fait non un "getChar()" ne marche pas car il ne marche qu'en console...
 
Je n'arrive pas à trouver...  
aidez-moi...

Reply

Marsh Posté le 15-11-2003 à 16:21:16    

personne ne veut répondre ??

Reply

Marsh Posté le 15-11-2003 à 18:18:50    

babthefox2002 a écrit :

personne ne veut répondre ??


mais si ...
 
Y a peut être moyen de faire plus simple mais ca ca marche ...
 

Code :
  1. import java.io.*;
  2. public class Quizz {
  3. private String[] question = {"Est ce que java c'est bien ?", "Benou il est gentil ?", "pourquoi ?"};
  4. private String[] bonneReponse = {"oui", "bien sur", "parce que !"};
  5. private int tpsPresentation = 1000;
  6. private int tpsReponse = 10000;
  7. private Thread lecteurClavierThread;
  8. private LecteurClavier lecteurClavier;
  9. private String luClavier;
  10. public Quizz() {
  11.  this.lecteurClavier = new LecteurClavier(this);
  12.  this.lecteurClavierThread = new Thread(this.lecteurClavier, "lecteur clavier" );
  13.  this.lecteurClavierThread.setDaemon(true);
  14.  this.lecteurClavierThread.start();
  15. }
  16. public void demarrer() throws Exception {
  17.  for (int i = 0; i < this.question.length; i++) {
  18.   System.out.println("\"" + this.question[i] + "\"" );
  19.   Thread.sleep(tpsPresentation);
  20.   System.out.print("   --> Votre réponse : " );
  21.   System.out.flush();
  22.   String reponse = attenteReponse(this.tpsReponse);
  23.   if (reponse == null) {
  24.    System.out.println("\nVotre temps est écoulé.  La bonne réponse était : '" + this.bonneReponse[i] + "'" );
  25.    System.out.println("Vous êtes le maillon faible. Au revoir !" );
  26.    System.exit(0);
  27.   } else if (reponse.equalsIgnoreCase(this.bonneReponse[i])) {
  28.    System.out.println("Correct !" );
  29.   } else {
  30.    System.out.println("Mauvaise réponse. La bonne réponse était : '" + this.bonneReponse[i] + "'" );
  31.    System.out.println("Vous êtes le maillon faible. Au revoir !" );
  32.    System.exit(0);
  33.   }
  34.  }
  35.  System.out.println("\nC'était le maillon faible ! Bonne soirée. (clignement d'oeil)" );
  36.  this.lecteurClavierThread.interrupt();
  37. }
  38. /**
  39.  * Attend une réponse pdt le temps indiqué. Si aucune réponse n'est donnée dans le temps  
  40.  * imparti, retourne null
  41.  * @param tps : temps accordé
  42.  * @return la réponse ou null si temps accordé dépasse
  43.  */
  44. public String attenteReponse(int tps) throws Exception  {
  45.  this.luClavier = null;
  46.  this.lecteurClavier.lancerLecture();
  47.  synchronized (this) {
  48.   this.wait(this.tpsReponse);
  49.  }
  50.  return this.luClavier;
  51. }
  52. /**
  53.  * Cette methode est appelée lorsque d'une saisie au clavier est faite  
  54.  */
  55. public void setSaisieClavier(String s) {
  56.  this.luClavier = s;
  57.  synchronized (this) {
  58.   this.notify();
  59.  }
  60. }
  61. public static void main(String[] args) throws Exception {
  62.  new Quizz().demarrer();
  63. }
  64. // ---------------------------------------
  65. }
  66. class LecteurClavier implements Runnable {
  67. private final BufferedReader clavier;
  68. private Quizz demandeur;
  69. public LecteurClavier(Quizz demandeur) {
  70.  this.demandeur = demandeur;
  71.  this.clavier = new BufferedReader(new InputStreamReader(System.in));
  72. }
  73. public void lancerLecture() {
  74.  synchronized (this) {
  75.   this.notify();
  76.  }
  77. }
  78. public void run() {
  79.  while (! Thread.currentThread().isInterrupted()) {
  80.   synchronized (this) {
  81.    try {
  82.     this.wait();
  83.    } catch (InterruptedException e) {
  84.     break;
  85.    }
  86.   }
  87.   try {
  88.    String ligne = clavier.readLine();
  89.    this.demandeur.setSaisieClavier(ligne);
  90.   } catch (IOException e) {
  91.    throw new RuntimeException("Erreur lors de la lecture de la saisie de l'utilisateur", e);
  92.   }
  93.  }
  94. }
  95. }


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed