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

API standards et tierces Java Discussion :

[Windows] SwingUtilities.invokeLater ralentit mon programme


Sujet :

API standards et tierces Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut [Windows] SwingUtilities.invokeLater ralentit mon programme
    bonjour,

    je ne sais pas vraiment où placer ce post.
    mon problème concerne la perte de contrôle d'un programme : j'ai créé un Timer dont la méthode run() est appelée une fois par heure (pour les tests c'est toutes les 20s); la création du timer se fait dans le constructeur d'une classe qui est "conteneur" d'une fenêtre (elle a été créée par eclipse et son plugin windowBuilder), par cet appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Ecran_principal() {
     
            initialize();
            this.frame.setVisible(true);
     
            myTimer.schedule(new Loop(this), 0, 20000);
     
        }
    la classe Loop contient donc une méthode run(), qui est le programme principal : accès à deux bases de données et à une JTable de la fenêtre dont je parlais tantôt.
    je voudrais implémenter le comportement suivant : attendre 5mn (le temps qu'un SMS soit envoyé par le programme) pour récupérer le code de retour de ce SMS.
    j'ai pensé à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    new Thread(new Runnable() {
                public void run() {
                    SwingUtilities.invokeLater(new Runnable() {
     
                        ArrayList<Map<String, Object>> al_5 = null;
     
                        public void run() {
                            // attendre 5mn
                            try {
                                Thread.sleep(1000 * 60*5);
                            } catch (InterruptedException e) {
     
                                System.out.println(e);
                            }
    mais cela bloque l'accès à la table (le programme ne réponds que de temps en temps), c'est génant.
    même le clic sur le bouton "exit" mets du temps.

    auriez-vous des conseils?

    merci,

    olivier

    ps: la méthode appelée toutes les 5mn (dans invokeLater) contient des appels à une base, et modifie la JTable.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Il ne faut pas faire de sleep dans l'appel de invokeLater.
    Tu bloques le thread responsable de la gestion des événements Swing.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu n'as pas compris l'intérêt d'invokeLater() : cette méthode permet de modifier l'interface graphique et ne dois contenir que des traitements "court et rapide" sous peine de bloquer l'interface utilisateur...

    Dans ton cas, le SwingWorker serait plus approprié...


    a++

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Par défaut
    merci pour vos réponses.

    en fait, les accès en base étant rapides, je vais appeler le Timer toutes les 5s ou 10s, et supprimer invokeLater.

    mais merci, et je vais regarder SwingWorker, on ne sait jamais, ça peut servir.

    olivier

Discussions similaires

  1. [Débutant] windows form multiple dans mon programme
    Par QAYS dans le forum Windows Mobile
    Réponses: 0
    Dernier message: 03/12/2012, 11h00
  2. SwingUtilities.invokeLater casse mon redimensionnment
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/06/2007, 10h42
  3. Mon programme empêche l'arrêt de Windows
    Par forzalec dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/11/2006, 14h27
  4. Réponses: 13
    Dernier message: 02/11/2006, 15h12
  5. Souci de fermeture de mon programme à la fermeture de Window
    Par Foromus dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/03/2006, 16h01

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