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 :

Récupérer le résultat d'une tache de fond dans une procédure appelante


Sujet :

JavaFX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 141
    Points : 109
    Points
    109
    Par défaut Récupérer le résultat d'une tache de fond dans une procédure appelante
    Bonjour à tous,

    J'ai réalisé ces dernières années un logiciel de carnet de vols pour parapentistes (déchargement de traces GPS et affichage cartographique) dans un langage proche de Visual Basic. J'entreprends la réécriture de ce logiciel en javaFX afin de le passer en open source. Je pars avec un niveau en java proche de zéro... autant dire que je passe beaucoup de temps sur ce forum qui est une aide précieuse... merci à tous.

    J'ai une procédure de transfert de fichiers d'un répertoire à un autre. J'ai développé une fonction permettant d'afficher une jauge de progression grâce au tutoriel de Bouye.

    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
    50
    51
    52
    53
    54
     
    private void moveFiles(File[] files, String newPath) {
     
            ProgressForm pForm = new ProgressForm();
            i18n = I18nFactory.getI18n(logfly.Logfly.class.getClass());
     
            Task<Boolean> task = new Task<Boolean>() {
                @Override
                public Boolean call() throws InterruptedException {                
                    int lengthFiles = files.length;
                    int idx = 0;
                    boolean res = false;
                    for (File f : files) {
                        try {                            
                            File dest = new File(newPath+myConfig.getOsSeparator()+f.getName());
                            Files.move(f.toPath(), dest.toPath(),StandardCopyOption.REPLACE_EXISTING);
                            idx++;
                            updateProgress(idx, lengthFiles);
                        } catch (IOException e) {
                            updateProgress(lengthFiles, lengthFiles);                        
                        }                    
                    }  
                    res = true;
                    updateProgress(lengthFiles, lengthFiles);  
                    return res ;
                }
            };
     
            pForm.activateProgressBar(task);
     
            task.setOnSucceeded(event -> {
                pForm.getDialogStage().close();
                alertbox aInfo = new alertbox();
                aInfo.alertInfo(i18n.tr(Integer.toString(files.length)+" fichiers transférés"));
                if (task.getValue())  {
                    // On change pathdb
                    myConfig.setPathDb(newPath+myConfig.getOsSeparator());
                    myConfig.setFullPathDb(newPath+myConfig.getOsSeparator()+myConfig.getDbName());                                   
                    // On relance l'affichage
                    rootController.changeCarnetView();
                }
            });
     
            task.setOnFailed(event -> {
                pForm.getDialogStage().close();
                alertbox aError = new alertbox();
                aError.alertError(i18n.tr("Erreur pendant le transfert de fichiers"));
            });
     
            pForm.getDialogStage().show();
     
            Thread thread = new Thread(task);
            thread.start();                
        }
    Cette procédure est intégrée à un controller. Au clic, l'utilisateur sélectionne un dossier et la procédure moveFiles est appelée. Cela fonctionne, mais j'aurais aimé déporter la procédure moveFiles dans une classe utilitaires à part car j'aurai besoin de cette procédure à plusieurs reprises dans le programme. Comment transmettre le résultat à la procédure appelante ? Actuellement je fais le traitement dans l'évènement task.setOnSucceeded (myConfig.blabla...). Comment rendre cette procédure plus générique et renvoyer un booléen à la procédure appelante qui fera alors le traitement (myConfig.blabla...) ?

    J'ai exploré thread.join() mais la jauge ne s'affiche plus...

  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
    Depuis JavaFX 8 tu peux appeler updateValue() depuis le corps de ta tâche ce qui veut dire que tu peux mettre un écouteur sur la propriété value de ton service et réagir lorsque cette valeur change. Dans ce cas le onSucceeded te permet juste de valider que ta tâche est bien terminée. Deux petits bémols quand à cette méthode :

    • La propriété ne changera que si la valeur est différente à chaque fois. Donc tu dois créer un objet résultat différent à chaque appel de cette méthode.
    • Comme toutes les autres méthodes updateXXX() si trop d'appels à cette méthode ont lieu, certaines valeurs intermédiaires sont "perdues"/"sautées" pour éviter de surcharger le thread événementiel de JavaFX.
    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
    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
    Ou alors je n'ai pas bien compris ta question
    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

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 141
    Points : 109
    Points
    109
    Par défaut
    Merci Bouye pour cette réponse rapide... Tu as parfaitement compris la question.

    J'avais effectivement vu le paragraphe concernant upadteValue dans ton tuto sans pour autant comprendre comment l'utiliser. L'implémentation d'un listener me met sur la voie mais y'a du boulot

    Sinon je songeais à travailler sur le code que tu avais donné dans ce post.

Discussions similaires

  1. Réponses: 13
    Dernier message: 12/03/2015, 18h06
  2. Réponses: 1
    Dernier message: 07/05/2014, 18h27
  3. Réponses: 6
    Dernier message: 21/09/2006, 17h33
  4. Etirer une image de fond dans une cellule
    Par dreamanoir dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/07/2005, 14h39
  5. Réponses: 4
    Dernier message: 03/05/2005, 09h03

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