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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    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 expérimenté
    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
    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 confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    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 expérimenté
    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
    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 confirmé
    Homme Profil pro
    .
    Inscrit en
    Octobre 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Octobre 2018
    Messages : 62
    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 expérimenté
    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
    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()

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