Timer random

Fermé
lightfire - Modifié le 3 août 2018 à 22:53
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 5 août 2018 à 18:47
Bonjour,


Je souhaite créer une app qui génère un son avec un interval de temps random entre deux bornes.

pour le timer j'ai ce code là :

randomNumber = (int)(Math.random() * (max-min)) + min;
     
    
     timer.schedule (new TimerTask() {
                 public void run()
                 { 
                  if(round>0){
                   randomNumber = (int)(Math.random() * (max-min)) + min;
                   f.play();
                   round--;
                   System.out.println(randomNumber);
                   
                  }
                  else
                  {
                   timer.cancel();
                  }
                 }
             },randomNumber*1000,1 )



Le souci est que une fois que le timer est configuré pour une valeur de temps celle-ci n'est plus changeable.

J'ai essayé avec une boucle autour du timer ( en le faisant biper que une seul fois) mais nada.

Avez vous une idée?

merci
A voir également:

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 août 2018 à 23:22
Bonjour,

La solution simple, c'est de faire un Thread.sleep pour attendre aléatoirement une durée.

Remarque : dans cette configuration je ne suis pas convaincu qu'un TimerTask soit vraiment pertinent, un simple Thread avec une boucle for ferait parfaitement l'affaire.

public class Test {

    private static void task() {
        long min = 1, max = 5;
        for (int round = 0; round < 10; round++) {
            long randomNumber = (long) (Math.random() * (max - min)) + min;
            System.out.println(randomNumber);
            f.play();
            try {
                Thread.sleep(randomNumber * 1000);
            } catch (InterruptedException e) {
            }
        }
    }

    public static void main(String[] args) {
        new Thread(Test::task).start();
    }
}
1
Hello merci pour ta réponse.

j'ai testé cette possibilité. j'ai un souci de compilation : il ne connait pas la ligne 17 de ton code. c'est plutôt étrange.

par contre j'ai une question stratégique. J'ai fais la class Test comme toi, mais la partie que tu as dans le main avec le new Thread(...), moi je dois le mettre dans la fonction qui gère mon "click"?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > lightfire
5 août 2018 à 12:44
"il ne connait pas la ligne 17 de ton code"
Avec quelle version de Java est-ce que tu code ?
Les références de méthodes, comme
Test::task
, ont été introduite avec Java 8 (en 2014).

Si tu codes en Java 7 ou moins, tu peux remplacer cette ligne par ceci (plus long, entre autres inconvénients)
new Thread(new Runnable() {
    @Override
    public void run() {
        task();
    }
}).start();

Quant à l'intégration dans ton code, il faut mettre le start() du Thread à la place du schedule() de ton Timer, donc dans le
if (newGameButton.isChecked())
de ta méthode clicked().

Remarque : si tu faisais du Swing il serait plus efficace d'utiliser des SwingWorker (des Thread sécurisés pour Swing).
Il existe peut-être un équivalent dans GDX2D, mais dans un premier temps le Thread devrait suffire.
0
luckydu43 Messages postés 3484 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 30 juin 2022 815
3 août 2018 à 21:36
Bonsoir !

Avez-vous essayé en remplaçant le
round--;

par un
round++;

?
0
Bonsoir,
pas testé mais les round tournent correctement. je l'ai pas dit dans la description le round est une variable correspondant au nombre de signal sonor que l'on veut.

Le souci vient vraiment du timer. le temps ne se met pas à jour àprès un bip

exemple : random entre 1 et 10
il génère le premier bip après 2s, tous les autres seront à 2 s et non pas par exemple : 2,5,8,4
0
luckydu43 Messages postés 3484 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 30 juin 2022 815
Modifié le 3 août 2018 à 22:01
j'aurais besoin d'un poil plus de code, notamment la méthode définie par f.play();

EDIT :
mouais en fait pas besoin que vous éditiez votre premier message, je me suis fait mes indentations perso
Surtout que je lis bien plus facilement le code sous la forme
private void methode (Object pParametre) {
    Object vInsererVariable;
    if (condition) {
        code;
    } else {
        codeBis;
    }
}


du coup...

Pouvez-vous écrire vos prochains message en plaçant le code dans une balise code ? ;-)
0
Avec plaisir mais... on fait comment ^^

La méthode f.play() est simplement la lecture du fichier sonor qui contient le"bip".

Je sais pas si ça aide mais j'utilise la librairie GDX2D.

En attendant de savoir comment faire la mise en forme voici la méthode complète. Celle-ci est appelée après un appuie sur le bouton start :

newGameButton.addListener(new ClickListener() {
   @Override
   public void clicked(InputEvent event, float x, float y) {
    super.clicked(event, x, y);

    if (newGameButton.isChecked())
    {
     
     randomNumber = (int)(Math.random() * (max-min)) + min;
     
    
     timer.schedule (new TimerTask() {
                 public void run()
                 { 
                  if(round>0){
                   randomNumber = (int)(Math.random() * (max-min)) + min;
                   f.play();
                   round--;
                   System.out.println(randomNumber);
                   
                  }
                  else
                  {
                   timer.cancel();
                  }
                 }
             },randomNumber*1000,1 ); // , temps avant premier bip, temps entre chaque bip
          
    }
    else
    {
     
    }
   }
  });
 }
0
luckydu43 Messages postés 3484 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 30 juin 2022 815
3 août 2018 à 22:05
Il y a un bouton à droite des boutons B, I et S... c'est celui-là :-D
Je mets en forme le code, je le regarde et je vous dis
0
luckydu43 Messages postés 3484 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 30 juin 2022 815
Modifié le 3 août 2018 à 22:48
En gros.

Dis-moi si je me suis trompé dans la lecture du code.
J'ai une piste, tout est commenté

this.newGameButton.addListener(
    new ClickListener() {
        /**
         * Surcharge de la méthode clicked de la classe parente :
         * on l'appelle, ________________________________________
         * puis on lance une séquence de sons aléatoire si le bouton
         * this.newGameButton est coché.
         */
        @Override
        public void clicked(InputEvent pEvent, float pX, float pY) {
            // Appelle de la méthode de la classe parente.
            super.clicked(pEvent, pX, pY);

            if (this.newGameButton.isChecked()) {
                // On initialise le rand ici.
                // Pertinence d'y mettre une valeur random direct ?!
                vRandomNumber = (int) (
                                    Math.random()
                                    * (this.max - this.min)
                                    + this.min
                                );
                
                /** TODO :  le temps ne se met pas à jour après un bip.
                 * 
                 * Exemple :
                 *
                 * random entre 1 et 10
                 * il génère le premier bip après 2s
                 * tous les autres seront à 2 s et non pas par exemple : 2,5,8,4
                 * 
                 * Points de détail :
                 * this.round : variable correspondant au nombre de signal sonore que l'on veut.
                 * Les round tournent correctement
                 */

                // Lancement d'une séquence de bips aléatoire.
                this.timer.schedule (
                    new TimerTask() {
                        
                        public void run() {
                            // Si this.round est positif.
                            if(this.round > 0){
                                // On regénère une valeur aléatoire dans le rand.
                                vRandomNumber = (int) (
                                    Math.random()
                                    * (this.max - this.min)
                                    + this.min
                                );
                                
                                // On lance la fonction play.
                                this.f.play();
                                // On décrémente le round.
                                this.round--;
                                // On affiche le rand.
                                System.out.println(vRandomNumber);
                            } else {
                                // Si this.round est négatif ou nul, on annule tout.
                                this.timer.cancel();
                            }
                        }
                    },
                    // temps avant premier bip
                    vRandomNumber * 1000,
                    
                    //   |
                    //   |
                    //   |
                    //   |
                    //  \|/
                    //   .
                    // MODIF APPORTÉE ICI.
                    // ... 1 auparavant.
                    // Merci d'avoir commenté "temps entre chaque bip" si c'est ça :-D
                    vRandomNumber * 1000
                    //   .
                    //  /|\
                    //   |
                    //   |
                    //   |
                    //   |
                    
                // Après cette ligne, la séquence est exécutée. PAS AVANT.
                );
            }
        }
    }
); 


Ah et ouais. Comme je l'ai dit j'ai pas la même façon de lire le code :-)

EDIT : les indentations foutent le sbeul, je les ai remplacées par 4 espaces. Gare au copy/paste :-D

EDIT bis : y avait une virgule en trop et des commentaires perdus
0
hello, alors en rajoutant le deuxième vRandNumber ça ne change rien :(
ce qui est étrange c'est que si on met le timer dans une boucle for, celle-ci s'exécute et le timer se fait en parallèle. c'est pas le timer lui-même qui recommence. ( je sais pas si c'est compréhensible ahah)
0
Hello tout le monde alors c'est tout bon ! avec le thread() ça tourne du tonner de dieu! merci encore !

Une petite dernière, je profite de votre grande bonté ;)

Je travail sur éclipse. Est-ce qu'il y a possibilité d'exporter directement au format application pour android ou il y a un programme pour le faire?

Encore merci!
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
5 août 2018 à 18:47
Je ne connais pas la programmation Android et encore moins GDX2D. Mais cela doit être expliqué dans la documentation de la bibliothèque.

Cependant je doute qu'un code fait pour un ordinateur fonctionne tel quel sur Android, il faudra faire des manipulations, peut-être même du code en plus, afin de le faire fonctionner.

Remarque : c'est le genre de test qu'il aurait mieux fallu faire avant de faire ton programme, histoire de vérifier que cette bibliothèque correspondait bien à ton besoin, avant d'écrire un code complet...
0