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

JavaFX Discussion :

Delais entre deux éxécutions


Sujet :

JavaFX

  1. #1
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut Delais entre deux éxécutions
    Bonjour,


    J'aimerai pouvoir rajouter un délais d'éxécution entre 2 instructions sans empêcher le reste de fonctionner. J'ai essayé Thread.sleep(2000) mais cela bloque toute ma fenetre graphique.
    Pour être plus précis, j'aimerai envoyer des vaisseaux par vagues. Pour se faire je mets un délais de 2 secondes entre chaque spawn de vague, mais comme dit au dessus, ma fenetre freeze, et affiche tout d'un coup juste après..
    Une solution ?

    Merci d'avance !

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Salut !

    Je ne suis pas sur d'avoir bien compris le contexte mais je pense que d'apres la description ce que tu cherches a faire est un system de Producer/Consumer.

    Creer une queue dont le thread principal y inserera les executions (producer) et cree egalement un Executor qui se reveille tous les X secondes qui aura la responsabilite de prendre les executions de la queue pour terminer le flow (Consumer).
    Tu peux egalement regarder du cote de Spring Reactor qui a de bonnes implementations pour cela mais c'est deja un peu plus avance.

  3. #3
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut
    Je pensais utiliser un AnimationTimer. J'ai vu qu'on pouvait mettre sa vitesse dans le paramètre de son handle. Je voyais donc déclenché cette animationTimer autant de fois que j'ai de vague de vaisseau à envoyer ( 10 vaisseau max par vague ). Et une fois que j'ai plus de vague, je stop l'animationTimer. Du coup j'ai quelque chose comme ça :
    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
       while(nbWave != 0) {
    	                		timer = new AnimationTimer() {
    	                			int nbSpaceship = nbSpaceCraft;
    	                			int nbTotalSpaceshipSpawn = 0;
     
    	                			@Override 
    	                            public void handle(long timer) { 
    	                				if(nbSpaceship - nbTotalSpaceshipSpawn > 10) {
    	                					animationSpawnSpaceship(p, 10);
    		                	            nbTotalSpaceshipSpawn += 10;
     
    	                				}else {
    	                					animationSpawnSpaceship(p,nbSpaceship - nbTotalSpaceshipSpawn);
     
    	                				}
    	                	            timer = 1000000000;	/* Je mets mon timer à 1 seconde */                	                   
    	                			} 
    	                		};
    	                		timer.start();
    	                		nbWave++;
    	                	}
    Malheureusement ça ne fonctionne pas, ma fenêtre se bloque et j'ai probablement très mal écrit ça..

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Salut,

    Je ne connais pas cet object AnimationTimer mais il ressemble fortement a un simple Executor.

    Quoi qu'il en soit, ton code ne peux pas fonctionner puisque tu crees dans chaque iteration de ta bloucle while un nouveau AnimationTimer. Chaque AnimationTimer cree ecrase le precedent.

    Ton AnimationTimer doit etre une variable de ta classe qui sera instancier puis demarrer dans ton constructor de classe ou en tant que variable static si qu'une seul instance est necessaire (voir code ci dessous).
    A chaque trigger du timer, la methode handle() sera appele automatiquement. Ta boucle while n'a pas lieu d'etre.


    Je te montre un exemple avec un Executor :

    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
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
     
    public class Tester {
     
       private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor();
       private static final long DELAY_BEFORE_FIRST_EXECUTION_0L = 0l;
       private static final long WAITING_TIME_BETWEEN_TWO_ITERATIONS_1000L = 1000l;
     
       public static void main(String... args) {
           EXECUTOR.scheduleAtFixedRate(new MyRunnable(),
                   DELAY_BEFORE_FIRST_EXECUTION_0L,
                   WAITING_TIME_BETWEEN_TWO_ITERATIONS_1000L,
                   TimeUnit.MILLISECONDS);
       }
     
     
       private static class MyRunnable implements Runnable {
     
           // This method will be called for each iteration of the executor.
           @Override
           public void run() {
                // Do your logic...
           }
       }
    }

  5. #5
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut
    En effet, ta solution est bien plus adéquat vis à vis de mon problème ! J'ai réussi à la créer, mais par contre, je n'arrive pas à l'arrêter correctement.
    J'utilise la method shutdown() mais elle coupe directement l'execution...

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Salut,

    Selon le API tu as deux possibilites pour interrompre l'executor :

    void shutdown()
    Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. Invocation has no additional effect if already shut down.
    This method does not wait for previously submitted tasks to complete execution. Use awaitTermination to do that.

    Throws:
    SecurityException - if a security manager exists and shutting down this ExecutorService may manipulate threads that the caller is not permitted to modify because it does not hold RuntimePermission("modifyThread"), or the security manager's checkAccess method denies access.


    ---------------------------------------

    List<Runnable> shutdownNow()
    Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of the tasks that were awaiting execution.
    This method does not wait for actively executing tasks to terminate. Use awaitTermination to do that.

    There are no guarantees beyond best-effort attempts to stop processing actively executing tasks. For example, typical implementations will cancel via Thread.interrupt(), so any task that fails to respond to interrupts may never terminate.

    Returns:
    list of tasks that never commenced execution
    Throws:
    SecurityException - if a security manager exists and shutting down this ExecutorService may manipulate threads that the caller is not permitted to modify because it does not hold RuntimePermission("modifyThread"), or the security manager's checkAccess method denies access.


    ------------------------------------

    Source :https://docs.oracle.com/javase/7/doc...tml#shutdown()

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et sinon une PauseTranstion ca marche aussi bien sans trop se prendre la tête (ce qui te permet de créer une SequentialTransition pour faire tes envoies de vaisseau).

    Après ça dépend comment tu abordes tes animations dans ton jeu : avoir plein de transitions ou utiliser un unique AnimationTimer histoire d'avoir un unique timer centralisé.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut
    En effet, PauseTransition semple encore plus approprié. Le problème est que le spawn de mes vaisseaux n'est pas une animation. J'ajoute simplement le shape que j'ai créé à mon root. Puis ensuite je fais le déplacement, du coup l'animation. Moi j'aimerai pouvoir faire une pause dans l'ajout de mes shape au root. Dans mon cas de 10 shapes par 10 shapes.
    Quand j'ai voulu executer la technique de l'executor, cela bloqué d'ailleurs à ma ligne d'ajout de de mon shape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root.getChildren().add(vaisseau.getRectangle());

  9. #9
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    Points : 79
    Points
    79
    Par défaut
    J'ai adopté une solution un peu plus simple, mais le problème est que cela freeze le jeu pour je ne sais quelle raison.

    Voilà mon 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
      void planetInteractionWithMouse() {
        	System.out.println("MOUSE INTERACTION");
        	System.out.println("TAILLE LIST PLANET = " + this.env.getListPlanet().size());
        	for(Planet p : this.env.getListPlanet()) {
        		System.out.println("PLANETE MODIFIE");
        		p.getShape().setOnMousePressed(new EventHandler<MouseEvent>()
                {
     
        			@Override
                    public void handle(MouseEvent e) {
                        p.getShape().setStrokeWidth(10.0);
                        if(p.getPlayer().getName() != "None") {
                        	double pourcentage = (env.getValue()/100.0);
                        	double nbSpaceCraftDouble = pourcentage*p.getNbSpaceCraft(); /* Nous récupérons le nombre de vaisseau à spawn */
                        	int nbSpaceCraft = (int)nbSpaceCraftDouble; /* Nous le transformons en int après. Direct marche pas -> Ca fait 0 */
                        	int nbWave = nbSpaceCraft / 15; /* Nous calculons le nombre de vague s'il y a beaucoup de monstre à spawn */
                        	System.out.println(nbWave);
                        	if(nbWave == 0) { /* Si nous n'avons qu'une vague */
                        		env.animationSpawnSpaceship(p, nbSpaceCraft);
                        	}else { /* Si nous en avons plusieurs */
                        		while(nbWave != 0) {
                        			if(System.currentTimeMillis() - p.getCur_time() > 800) {
                        				if(nbSpaceCraft > 15) {
                        					env.animationSpawnSpaceship(p, 15);
                        					nbSpaceCraft -=15;
                        				}else {
                        					env.animationSpawnSpaceship(p, nbSpaceCraft);
                        					nbSpaceCraft = 0;
                        				}
                        				p.setCur_time(System.currentTimeMillis());
                            			nbWave--;
                            		}
                        		}
     
                        	} 	          
                        }
                    }
                });
     
        		p.getShape().setOnMouseReleased(new EventHandler<MouseEvent>()
                {
        			@Override
                    public void handle(MouseEvent t) {
        				p.getShape().setStrokeWidth(1.0);
                    }
                });
     
        	}
        }
    La planète est un node. Quand je clique dessus, voilà ce qu'il se passe. Je récupère le nombre de vaisseau que je divise par 15 pour avoir le nombre de vague ( 15 vaisseaux max par vague).
    Je stock le temps de la dernière vague envoyée sur la planète (p.getCur_time()). Si la différence avec le temps actuel est de 800, alors j'envoie la prochaine vague, et je fais ça tant que je n'ai pas envoyé toutes mes vagues.. Mais du coup, mon jeu freeze. Savez vous pourquoi ?
    Est-ce que c'est à cause de la boucle while ? Car une fois toutes les vagues envoyés, le jeu ne freeze plus et j'ai mes vaisseaux qui s'affichent et qui se sont correctement déplacés

    Les methods pour spawn nos vaisseaux et les déplacer sont les suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public void animationSpawnSpaceship(Planet p, int i, Planet target) {
    		  ArrayList<SpaceCraft> listSquad = p.spawnSpaceCraft(i);
    	      spawnSpaceCraftGraphic(listSquad);
    	      System.out.println("On est là");
    	      p.getPlayer().getListSpaceCraft().add(listSquad);
    	      for(SpaceCraft sc : listSquad) {
    	        sc.moveToPlanet(target,root);
    	      }
    		}
    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
    public ArrayList<SpaceCraft> spawnSpaceCraft(int nb) {
    		ArrayList<SpaceCraft> list = new ArrayList<SpaceCraft>();
    		System.out.println("Size = " + nb);
    		double partitionCircle = (2*Math.PI) / nb;
    		double radius = this.shape.getRadius();
    		double x = this.shape.getCenterX();
    		double y = this.shape.getCenterY();
    		for(int i = 0; i < nb ; i++) {
    			double angle = i * partitionCircle;
    			SpaceCraft spaceShip = new SpaceCraft(this.player);
    			double newX = x + Math.cos(angle) * (radius + 20) ;
    			double newY = y + Math.sin(angle) * (radius + 20);
    			angle = Math.toDegrees(angle);
    			spaceShip.getRectangle().setLayoutX(newX - spaceShip.getRectangle().getLayoutBounds().getMinX());
    			spaceShip.getRectangle().setLayoutY(newY - spaceShip.getRectangle().getLayoutBounds().getMinY());
    			spaceShip.getRectangle().getTransforms().add(new Rotate(135 + angle));
     
    			spaceShip.getRectangle().setFill(player.getColor()); // Et je lui ajoute la couleur du joueur;
    			this.nbSpaceCraft -= 1;
     
    			list.add(spaceShip);
     
    		} 
    		System.out.println("SpawnSpaceCraft list size = " + list.size());
    		return list;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void spawnSpaceCraftGraphic(ArrayList<SpaceCraft> listSquad){
    		System.out.println("SpawnSpaceCraftGraphic listSquad size = " + listSquad.size());
     
    		for(SpaceCraft vaisseau : listSquad) {
    			root.getChildren().add(vaisseau.getRectangle());
    			System.out.println("Ajouté au root");
    		}
    	}

Discussions similaires

  1. communication entre deux executables
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 13/04/2005, 22h19
  2. [.NET VC++] ou exclusif entre deux String
    Par benoitB dans le forum MFC
    Réponses: 7
    Dernier message: 25/11/2003, 11h20
  3. Temps de réponse entre deux sites
    Par coup dur dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 16/10/2003, 15h26
  4. Connexion entre deux ordi [Débutant]
    Par Ryadus dans le forum Développement
    Réponses: 2
    Dernier message: 12/06/2003, 21h47
  5. Réponses: 5
    Dernier message: 25/03/2003, 19h43

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