Attente conditionnelle en java

Attente conditionnelle en java - Java - Programmation

Marsh Posté le 23-12-2009 à 11:15:39    

Bonjour tout le monde !
Voici mon problème :
Une fonction est déclenchée par le fait que l'utilisateur appuit sur la barre espace.
Je voudrais que mon programme attente  
soit : jusqu'a ce que l'utilisateur la lache
soit : si cela fait pus de 3 seconde, que le programme continue, même si la barre espace est toujours enfoncée.
 
J'avais fait cela :
public void fire() {
while (boutonBarreEnfonce==true && tTir<3) {
      try {
    Thread.sleep(100);
   }
      catch (InterruptedException e) {
    e.printStackTrace();
   }  
      tTir=tTir+0.1;
}
}
 
et  
public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
if (key == KeyEvent.VK_SPACE) {
         boutonTirEnfonce=false;
                 }
 
}
 
En fait java ne fait "qu'une chose à la fois" et ne vérifie pas les entrées de l'utilisateur tant qu'il n'en a pas fini avec la fonction contenant ma boucle while.
Peut-on lui dire de garder une oreille attentive aux entrés clavier en même temps ?
 
NB : Tous ce qui est question du KeyListener marche bien, le problème ne vient pas de là.
 
Un grand merci !

Reply

Marsh Posté le 23-12-2009 à 11:15:39   

Reply

Marsh Posté le 23-12-2009 à 11:27:01    

Bonjour,
Je dirais que ta facon de faire n'est pas bonne: Je crois qu'en fait il faut que lorsque tu as
- un keypressed(KeyEvent.VK_SPACE) tu lances un timer t de 3 secondes ET tu positionnes boutonTirEnfonce a vrai
 
- un keyreleased(KeyEvent.VK_SPACE), tu positionnes boutonTirEnfonce a faux
- event timer t , tu positionnes boutonTirEnfonce a faux
 
(Mais j'ai l'impression que ta boucle de traitement des messages de fenetres n'est pas correcte, au vu de ta question et de ta fonction fire)

Reply

Marsh Posté le 23-12-2009 à 13:25:24    

Merci beaucoup, j'ai fait ce que tu m'as proposé mais j'ai encore un problème.
Je souhaite aussi pouvoir récupérer le temps t auquel l'utilisateur lache la barre espace (relativement au moment ou il a appuyé dessus, donc 0<t<3sec).
Pour cela il me faudrait une fonction de timer qui me renvoie le temps depuis le start(); mais cela n'existe pas je crois.
La fonction timer.getDelay(); me renvoie 3sec, ce n'est pas ce que je veux.
Il y a-t-il un moyen de contourner le problème ?
 
Encore merci
(Autrement tout marche trés bien)


Message édité par alterganon le 23-12-2009 à 13:28:51
Reply

Marsh Posté le 23-12-2009 à 17:38:43    

Vois du coté de java.util.date.timestamp ( http://java.sun.com/j2se/1.4.2/doc [...] stamp.html )
en prenant une mesure lors de l'appui puis une autre lors du keyreleased/timer et en faisant la soustraction

Reply

Marsh Posté le 23-12-2009 à 17:45:28    

breizhbugs a écrit :

Vois du coté de java.util.date.timestamp ( http://java.sun.com/j2se/1.4.2/doc [...] stamp.html )
en prenant une mesure lors de l'appui puis une autre lors du keyreleased/timer et en faisant la soustraction


 
Non non, il s'agit d'un Timestamp SQL en Java, rien à voir avec la notion de TimeSpan en .NET.
 
Le plus simple est sans doute de récupérer System.currentTimeMillis() à 2 moments différents et de soustraire les valeurs.

Message cité 1 fois
Message édité par cbeyls le 23-12-2009 à 17:48:02
Reply

Marsh Posté le 23-12-2009 à 17:55:40    

cbeyls a écrit :


 
Non non, il s'agit d'un Timestamp SQL en Java, rien à voir avec la notion de TimeSpan en .NET.
 
Le plus simple est sans doute de récupérer System.currentTimeMillis() à 2 moments différents et de soustraire les valeurs.


 
Autant pour moi, j'avais lu trop vite! il s'agit de http://java.sun.com/j2se/1.4.2/doc [...] /Date.html mais effectivement vu la grandeur de temps mesuré,  System.currentTimeMillis() est parfait

Reply

Marsh Posté le 23-12-2009 à 18:12:23    

Avec la classe Date on ne peut pas faire de calculs de dates, à part comparer une date à une autre pour savoir si elle est antérieure ou postérieure.
Il n'y a pas encore d'équivalant à TimeSpan en Java, mais on peut faire des calculs basiques avec la classe Calendar.

Reply

Marsh Posté le 23-12-2009 à 23:15:53    

Merci, la méthode de la soustraction avec Systel.currentTimeMillis() marche à merveille !

Reply

Sujets relatifs:

Leave a Replay

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