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 chrono crash application


Sujet :

JavaFX

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut Thread chrono crash application
    Bonjour, j'ai implémenter un thread qui notifie une interface graphique avec le pattern observer
    Mon problème est que l'application freeze entièrement dès la 1er seconde à cause d'un bug.

    Je pense que le problème vient du sleep mais je ne comprend pas comment faire autrement
    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
    55
    56
    57
    58
    59
     
    package DATA.WORKTILE;
    import DATA.OBSERVER.Observable;
    import javafx.application.Platform;
     
     
    /**
     * Created by Jordan on 17/11/2015.
     */
    public class TimeCounter extends Observable {
     
        static int secondes;
        Thread thread;
        boolean running;
     
     
        public TimeCounter() {
     
        }
     
        public void start(){
     
            secondes = 0;
            running = true;
     
            thread = new Thread(new Runnable() {
                @Override public void run() {
     
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
     
                            while(running) {
                                try {
                                    secondes++;
                                    description = ""+secondes;
                                    notifie();
                                    System.out.println("pulse... " + secondes);
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                }
            });
     
            thread.start();
        }
     
     
     
        public void stop(){
     
            running = false;
        }
     
    }
    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Platform.runLater() exécute le code dans le thread de JavaFX : comme ce code est une boucle, et qu'un thread ne peut faire qu'une seule chose à la fois, tant que la boucle s'exécute, rien d'autre ne peut s'exécuter dans JavaFX. Ni affichage et ni interaction : donc l'UI est gelée. Par ailleurs, pourquoi lancer un thread pour lancer juste un process dans un autre thread (JavaFX) : si tu fais ta boucle directement dans ce thread, tu verras que ton UI n'est plus bloquée.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Merci de ta réponse, le problème est que j'ai toujours une exception (javais mi l'autre thread pour ne plus l'avoir)

    La classe ne notifie pas l'interface mais fait bien une pulsation par seconde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
    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
    public void start(){
     
            secondes = 0;
            running = true;
     
            thread = new Thread(new Runnable() {
                @Override public void run() {
     
                    while(running) {
                        try {
                            secondes++;
                            description = ""+secondes;
                            notifie();
                            System.out.println("pulse... " + secondes);
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
     
                }
            });
     
            thread.start();
        }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est dans notifie() que tu obtiens cette erreur ? Parce que tu y fais quelque chose qui doit être fait sur le thread JavaFX probablement : fait uniquement ça par le Platform.runLater() (pas la boucle complète en tout cas).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    J'avais aussi essayer avec seulement les platform.runLater mais dans ce cas le chrono fonctionne mais freeze l'application.

    Le problème ne vient pas de mon Observeur car je l'utilise dans d'autre partit du code sans souci
    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
    public void start(){
     
            secondes = 0;
            running = true;
     
     
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
     
                    while(running) {
                        try {
                            secondes++;
                            description = ""+secondes;
                            notifie();
                            System.out.println("pulse... " + secondes);
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
     
        }

  6. #6
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    essayer çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Platform.runLater(() -> notifie());
    code de la méthode start():

    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
    public void start(){
     
            secondes = 0;
            running = true;
     
            thread = new Thread(new Runnable() {
                @Override public void run() {
     
                    while(running) {
                        try {
                            secondes++;
                            description = ""+secondes;
                            Platform.runLater(() -> notifie());
                            System.out.println("pulse... " + secondes);
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
     
                }
            });
     
     
            thread.start();
        }
    Je vous invite à consulter :http://stackoverflow.com/questions/3...abase-requests

  7. #7
    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
    : FAQ JavaFX / Concurrence

    Sans oublier un peu d'auto-pub :

    Tutoriel sur l'exécution d'une tâche de fond en JavaFX

    Pour le reste, la solution de win_ubuntu est tout a fait correcte si tu comptes rester avec ton propre Thread. Il faudra faire juste attention a ce qu'il n'y ait pas trop de notifications pour éviter d’étrangler le JavaFX Application Thread ; ici avec une notification par seconde, y a pas de soucis.
    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

Discussions similaires

  1. Crash Application WPF
    Par Lelio1407 dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 11/03/2010, 13h59
  2. Thread au niveau application
    Par zdidier dans le forum W4 Express
    Réponses: 3
    Dernier message: 09/04/2009, 18h08
  3. [JBoss] Thread Pool par application
    Par Jibee dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 23/12/2008, 09h16
  4. Crash Application si NotePad++ ouvert
    Par mr_samurai dans le forum Qt
    Réponses: 3
    Dernier message: 19/06/2008, 00h02
  5. [thread] fermer une application
    Par FFF dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 10/12/2005, 21h04

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