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 :

retour d'objet aprs ouverture d un Task


Sujet :

JavaFX

  1. #1
    Membre du Club
    Homme Profil pro
    Medecin Biologiste
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Medecin Biologiste
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Points : 49
    Points
    49
    Par défaut retour d'objet aprs ouverture d un Task
    Bonjour,
    j'essaye désespérement de manipuler un objet retourné par un task , sans succes ! En regardant ce qui s 'est fait sur le forum il semblerait que je ne suis pas le seul! Mon problème se rapproche je pense de Gazoline https://www.developpez.net/forums/d1...ultat-d-tache/

    J'essaye d'avoir accès à parametreR (objet contenant plusieurs String) afin de l'inclure dans un tableau ObservableList . Le Task que j ai repompé sur les tuto de Developpez.com fonctionne ...mais le problème c'est pouvoir ensuite utiliser l'objet!!!

    voici une partie de 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
    @FXML 
    	// Gestion du Bouton 5 ...
    	private void SiB5() {
    		final Service<Parametres> ReceptionUDP = new Service<Parametres>()
    		{
     
    		protected Task<Parametres> createTask() 
    				{
    		    return new Task<Parametres>(){
    		        @Override
    		        protected Parametres call() throws Exception {
    		        	Parametres parametreR = new Parametres();	
    		    		parametreR= udp.reception();
    		    		System.out.println(parametreR.getLatitude());
    		    		return parametreR;
    		        	} 
     
    		    	};
    			}
     
    		};
    		ReceptionUDP.start();
    	/*
    	 * j ai bien essayé de faire parametreR=ReceptionUDP.start(); pour faire ensuite un data.AddData(parametreR) ...
    	 *  Mais ça ne marche pas !!!
    	 * 
    	 */
    	}
    En attente de vos réflexions et de vos explications concernant le retour des Task
    Bien Cordialement

  2. #2
    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
    C'est pourtant plutôt clairement expliqué dans le didacticiel ainsi que la FAQ que j'ai écris, a savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    service.setOnSucceeded(event -> {
        final T data = (T) event.getSource().getValue();
        [...]
    });
    service.setOnCancelled(event -> {
        [...]
    });
    service.setOnFailed(event -> {
       final Throwable t = event.getSource().getException();
       [...]
    });
    service.start();
    ou

    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
    service.stateProperty().addListener(state -> {
       switch(state) {
            case SUCCEEDED: {
                    final T data = (T) event.getSource().getValue();
                    [...]  
                }
                break;
            case CANCELLED: {
                    [...]  
                }
                break;  
            case FAILED: {
                    final Throwable t = event.getSource().getException();
                    [...]  
                }
                break;
       }
    });
    service.start();
    Attention également si la tache exécutée par le service est très longue il vaut mieux conserver une référence sur le service sinon il risque de se faire garbage-collecter et donc aucun événement n'arrive jamais a bon port...
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Medecin Biologiste
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Medecin Biologiste
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Points : 49
    Points
    49
    Par défaut C est la ou j ai du mal ....
    Merci pour votre réponse , les tuto et la FAQ sont très bien et bien expliqués mais c'est moi ,j ai un peu de mal, j'ai bien vu ça :

    "Pour récupérer le résultat final d'un service, il suffit de récupérer la valeur de sa propriété en lecture seule value lorsque le service est dans l’état SUCCEEDED.

    Par exemple :


    Code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    service.setOnSucceeded(workerStateEvent -> { 
        final V result = service.getValue(); 
        System.out.printf("Traitement terminé %s !", result).println(); 
    });
    "



    En relisant votre Post j'ai enfin compris La Value est exploitable dan la routine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    service.setOnSucceeded(event -> {
        final T data = (T) event.getSource().getValue();
        [...  et la je mets mon addData() pour mon tableview ... ]
    });
    En attente de votre réponse pour savoir si je fais bien les choses . Et en tout cas avec tous mes remerciements car cette partie est difficile quand on est un simple passionné d'informatique et pas un professionnel
    En
    En attente de vous lire et avec tous mes remerciements pour votre première réponse.
    Cdt

  4. #4
    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
    Les deux sont équivalents. Dans la 1ere j'avais utilisé la référence externe sur la variable finale service, dans la seconde je suis passé par la variable event reçue en paramètre du callback.

    Des qu'il y a des callbacks ou des propriétés observables, le code perd sa linéarité. On ne réagit pas instantanément lorsque start() retourne (ce qui bloquerai le code de toute manière le temps que la tache s’exécute) ; en fait start() retourne instantanément et a ce moment la la tache n'a même pas démarrée.

    On doit poser, avant de lancer le service, des méthodes ou des écouteurs qui sont invoqués plus tard en réaction a un changement d’état lorsque la tache sera finie, échouée ou annulée. Donc on ne contrôle pas quand ces méthodes seront invoquées, on sait juste qu'elles le seront au moment opportun. Bref c'est de la programmation évènementielle / réactive.
    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

  5. #5
    Membre du Club
    Homme Profil pro
    Medecin Biologiste
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Medecin Biologiste
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Points : 49
    Points
    49
    Par défaut Oui c 'est tout a fait ça....
    Bonsoir,
    Oui vous avez tout à fait cerné mon problème de pensée , c'est vrai que ça n'est pas "naturel" que de mettre un listener pour savoir si la réponse du Task arrive ....
    Néanmoins un Grand Merci car ça marche je vais enfin essayer de récupérer les paramètres de mon Drone maison via l'UDP sur mon PC portable

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/11/2014, 17h00
  2. [WD-2010] Conserver ouverture objet après conversion word en pdf
    Par debdev dans le forum Word
    Réponses: 4
    Dernier message: 07/05/2013, 18h29
  3. retour d'objet par référence...
    Par sas dans le forum C++
    Réponses: 15
    Dernier message: 28/05/2005, 17h54
  4. [XSL-FO] retour à la ligne après un tableau ?
    Par Mrlud dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 25/04/2005, 17h15

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