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 tâche


Sujet :

JavaFX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut Récupérer le résultat d'une tâche
    Bonjour,

    Je me lance dans l'utilisation des services et des tâches, histoire de débloquer mon UI.

    Mais c'est encore assez confus pour moi... et je ne sais pas si je dois utiliser plutôt des services, ou plutôt des tâches.
    En plus je ne suis pas sûr d'utiliser correctement la valeur "return" de ma tâche.

    Voici la problématique dans son ensemble et puis un exemple de ce que j'utilise actuellement.

    En fait j'ai une tableView basée sur une observableList "filtreOL" qui elle même est basée sur une observablelist "sourceOL".
    L'utilisateur peut donc introduire des critères de filtre qui réduisent les items contenus dans ma filtreOL par rapport à ce qui est contenu dans ma sourceOL.

    Ce filtre fonctionne en une fraction de seconde et répond donc parfaitement aux besoins.

    Au chargement, ou parfois en cours d'utilisation, il est nécessaire de faire un appel en base de données pour créer ou recréer mon "sourceOL".

    Cette opération étant longue, je voudrais la passer en tâche de fond, pour pouvoir mettre des boutons en "disabled" et le curseur en "Wait".

    Je cherche donc à remplacer mon "olSource" par une nouvelle observableList rafraichie.

    dans le code ci-dessous, j'ai créé une ObservableList "results" qui est en dehors de ma tâche et qui est mise à jour par ma tâche. Je ne pense pas que ce soit la bonne utilisation...

    Je voudrais récupérer "results" une fois que la tâche est terminée. Il y a bien l'instruction "return results;" mais ça me le retourne où ??

    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
     
    package application;
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.concurrent.Task;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
     
    public class Main extends Application {
     
      @Override
      public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 300, 150);
        stage.setScene(scene);
        stage.setTitle("Sample");
        ObservableList<String> results = FXCollections.observableArrayList();
     
        Task<ObservableList<String>> task = new Task<ObservableList<String>>() {
          @Override protected ObservableList<String> call() throws Exception {
              updateMessage("message");
              //ObservableList<String> results = FXCollections.observableArrayList();
              for (int i=0; i<10; i++) {
                  if (isCancelled()) 
                    break;
                  results.add("aaa" + i);
                  updateProgress(i, 100);
              }
              return results;
          }
        };
        task.run();
        System.out.println(results.get(3));
     
        stage.show();
      }
      public static void main(String[] args) {
        launch(args);
      }
    }

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    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 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    L'UI lance un Service (qui peut être réutilisable - ou meme répétable, voir ScheduledService -). Le service crée une Task (et il la re-crée a chaque exécution). L'UI ne manipule jamais (en appelant call()) de tache directement. C'est le service qui se charge de créer le thread dans lequel la tache va tourner, de créer la tache, de la faire tourner dans ce thread et de faire la liaison avec le JavaFX App Thread pour faire remonter les divers propriétés observées.

    Alternativement on peut utiliser la tache dans un ExecutorService comme dans ce didacticiel. Mais alors bien sur on a plus accès aux propriétés observables.
    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 838
    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 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Et pour ce que tu veux faire on pourrait faire un truc dans le genre :

    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
    final ObservableList<Toto> resultList = ...
    // Faire qq chose quand le contenu de la liste change.
    resultList.addListener(change -> ...
    // Ou alors directement attacher la liste observable dans la table.
    final Service<Void> service = new Service<Void>() {
     
        @Override
        protected Task<Void> createTask() {
             return new Task<Void>() {
     
                  @Override
                  public Void call() {
                      [...]
                      // Update chunk.
                      if (isCancelled()) return null;
                      Platform.runLater(() -> resultList.addAll(...);
                      [...]
                      // Update chunk.
                      if (isCancelled()) return null;
                      Platform.runLater(() -> resultList.addAll(...);
                      [...]
                      // Update chunk.
                      if (isCancelled()) return null;
                      Platform.runLater(() -> resultList.addAll(...);
                      [...]
                      // Update chunk.
                      if (isCancelled()) return null;
                      Platform.runLater(() -> resultList.addAll(...);
                      [...]
                      return null;
                  }
             };
        }
    };
    service.start();
    Le but du jeu c'est :
    1. De faire les modifs dans la liste dans le JavaFX App Thread.
    2. De ne pas faire TROP de maj trop peu espacées de la liste pour ne pas noyer le JavaFX App Thread et donc de regrouper ces majs en blocs (ex: 10, 50, 100 données).
    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 confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci pour ton aide,

    Comme je n'ai pas besoin d'utiliser ma table view tant que toutes les données ne sont pas chargées, j'ai mis un listener sur mon service qui me retourne mon observableList "d'un coup".

    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
     
    public void initService()
           {
     
     
                 loadFromDbService  = new Service<ObservableList<NewModTrmVO>>()
                 {
                        @Override
                        protected Task<ObservableList<NewModTrmVO>> createTask()
                        {
                               return new Task<ObservableList<NewModTrmVO>>()
                               {
                                      @Override
                                      protected ObservableList<NewModTrmVO> call() throws Exception
                                      {                   
                                            //ici se fait l'appel en base de données qui prends quelques secondes
                                            return NewModController.getInstance().getOlNewModTrm("FZ0");
                                      }
                               };
     
                        }
                 };
     
     
                 loadFromDbService.stateProperty().addListener((ObservableValue<? extends Worker.State> observableValue, Worker.State oldValue, Worker.State newValue) ->
                 {
                        switch (newValue)
                        {
                               case RUNNING:
                                      break;
                               case READY:
                                      break;
                               case SCHEDULED:
                                      break;
                               case FAILED:
                                      System.err.println("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEreur dans service loadFromDbService");
                                      break;
                               case CANCELLED:
                                      break;
                               case SUCCEEDED:
                                      System.out.println("Service succeeded");
                                      trmOL =loadFromDbService.getValue();
                                      filtreTrmTv(filtreTerminTxt.getText());
                                      positionneSurIndice(chercheIndiceDUnId(ARepositionnerSurTrm));
     
                                      break;
                        }
                 });
           }
    problème résolu.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 838
    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 838
    Points : 22 846
    Points
    22 846
    Billets dans le blog
    51
    Par défaut
    Tu as aussi des callbacks individuels si besoin (ex : setOnSucceeded(), setOnFailed(), etc.).
    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

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

Discussions similaires

  1. ScheduledExecutorService Récupérer le résultat d'une tâche
    Par noOneIsInnocent dans le forum Général Java
    Réponses: 10
    Dernier message: 10/01/2015, 00h04
  2. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 15h07
  3. Réponses: 7
    Dernier message: 30/06/2005, 11h06
  4. récupérer le résultat d'une requete
    Par sheira dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2004, 12h04
  5. [C#] Récupérer le résultat d'une procédure stockée
    Par fabrice1596 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/10/2004, 14h45

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