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 :

[Thread] JavaFX et Thread


Sujet :

JavaFX

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut [Thread] JavaFX et Thread
    Bonjour à tous,
    J’ai un souci. Je veux que mon Thread change la visibilité de ma ProgressBar.
    Mais ça me renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
    	at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    	at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    	at javafx.scene.Scene.addToDirtyList(Unknown Source)
    	at javafx.scene.Node.addToSceneDirtyList(Unknown Source)
    	at javafx.scene.Node.impl_markDirty(Unknown Source)
    	at javafx.scene.Node$5.invalidated(Unknown Source)
    	at javafx.beans.property.BooleanPropertyBase.markInvalid(Unknown Source)
    	at javafx.beans.property.BooleanPropertyBase.set(Unknown Source)
    	at javafx.css.StyleableBooleanProperty.set(Unknown Source)
    	at javafx.scene.Node.setVisible(Unknown Source)
    	at application.ThreadImag.run(ThreadImag.java:27)
    Voici mon code que j'ai raccourci
    Code java : 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
    package application;
     
    import javafx.application.Application;
    import javafx.scene.Group;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.ProgressBar;
    import javafx.stage.Stage;
     
    public class ProgressBarApp extends Application {
     
        public static ProgressBar p1;
    	public Parent createContent() {
     
            p1 = new ProgressBar();
       		ThreadImag t= new ThreadImag();
       		t.start();
            Group group = new Group();
            group.getChildren().addAll(p1);
            return group;
        }
     
        @Override
        public void start(Stage primaryStage) throws Exception {
            primaryStage.setScene(new Scene(createContent()));
            primaryStage.show();
        }
        public static void main(String[] args) {
            launch(args);
        }
    }

    Code java : 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
    package application;
     
    public class ThreadImag extends Thread{
    	private int nb_ligne=1200;
    	int ii=0;
    	public ThreadImag() {
    	}
     
    	public void run() {
    			for (int i = 0; i < nb_ligne; i++) {
    				if (i > ii + 99) {
    					ii = i;
    					System.out.print("\r" + i + "/" + nb_ligne);
    					ProgressBarApp.p1.setProgress((double)(i)/nb_ligne);
    						try {
    							Thread.sleep(100);
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    				}
    			}
    			ProgressBarApp.p1.setVisible(false);
    			System.out.print("\n");
    		System.out.println("Thread off");
    		Thread.currentThread().interrupt();
    	}
    }

    Sinon j'avais essayé de modifier de texte (pour afficher le pourcentage de ma ProgressBar) et ça me renvoyait la même erreur
    J'ai essayé de trouver cette erreur sur Google, mais vue que je ne la comprends pas très bien et que je fais habituellement des Thread en C, j'avoue avoir du mal à trouver.
    Merci
    David B.

  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
    Dans son API publique JavaFX utilise 2 threads :
    • Le JavaFX Application Thread - dans lequel sont effectué les manipulation des contrôles attachés a une scène et les réactions aux événements.
    • Le thread media - qui est utilisé entre autre par les animations et transitions.


    Tu modifies une ProgressBar qui est rattachée a une scène, comme l'indique l'erreur une telle manipulation ne peut être faite que sur le JavaFX Application Thread or toi tu le fais depuis un autre thread d’où l'erreur.

    Une manière de corriger le problème est de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProgressBarApp.p1.setProgress((double)(i)/nb_ligne);
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Platform.runLater(() -> ProgressBarApp.p1.setProgress((double)(i)/nb_ligne));
    idem si tu veux modifier le texte.

    Sinon, JavaFX offre un framework déjà tout fait pour exécuter des taches de fond, il s'agit de Service<T> et Task<T> (T est ici le type de l'objet produit par la tache et retourné par le service. Utiliser le type Void et faire un return null a la fin de la méthode call() de la tache pour une tache qui ne retourne rien).
    • Service<T> - est la classe a manipuler depuis l'UI (ex: dans le callback qui effectue l'action d'un bouton) et sert a créer une tache, c'est une classe réutilisable.
    • Task<T> - est la tache a proprement dite, elle est créée par le service. Elle n'est utilisée qu'une seule et unique fois et le corps de la fonction call() sera appelé dans un autre thread.


    La tache dispose de plusieurs methodes qui sont appelable directement depuis le thread d’exécution et qui mettront a jour des propriétés sur le service de manière thread safe.
    • updateProgress() - mise a jour de la progression.
    • updateMessage() - mise a jour du message.
    • updateTitle() - mise a jour du titre.


    Ainsi, il est possible de binder la propriété progress de la ProgressBar sur la propriété progress du Service pour voir la barre se remplir automatiquement d’elle-même durant l’exécution du service et sans jamais avoir besoin de la manipuler manuellement depuis le code de la tache (on ne fait que appeler updateProgress() durant la tache).

    Coté service on a 3 callbacks qu'on peut utiliser pour réagir lorsque ce dernier se fini:
    • onCancelled - il a été annulé. La tache peut a tout moment vérifier si le service a été annulé en testant isCancelled().
    • onFailed - il a échoué, on peut récupérer l'exception en appelant getException().
    • onSucceeded - tout s'est bien passé, on peut récupérer le résultat en appelant getValue().



    PS : J'ai aussi un article sur ça qui prend la poussière depuis des lustres (bien 10 mois maintenant) en attente de relecture donc si l'un d'entre vous se sent l’âme d'un correcteur technique (la correction orthographique sera faite plus tard par des correcteurs dédiés), n’hésitez pas à postuler auprès du responsable de section
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour cette solution ça fonctionne
    Je vais essayer de voir ce que tu m'as dit après
    Merci beaucoup
    David B.

  4. #4
    Membre actif
    Profil pro
    developpeur
    Inscrit en
    Septembre 2010
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Septembre 2010
    Messages : 219
    Points : 204
    Points
    204
    Par défaut thread et javafx
    Merci cela m'aide aussi.

  5. #5
    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
    Évitez de déterrer des anciens messages SVP.

    PS : l'article dont il était question : Tutoriel sur l'exécution d'une tâche de fond en 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

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/10/2014, 00h58
  2. [Thread]Relancer un thread
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 28/04/2005, 20h41
  3. [Thread] Interrompre un Thread
    Par Arnaud51 dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 13/03/2005, 21h41
  4. [Thread] Retrouver un thread dont on a plus la référence
    Par ptitjack dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 01/10/2004, 10h56
  5. Réponses: 3
    Dernier message: 11/02/2004, 12h50

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