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

Interfaces Graphiques en Java Discussion :

[Timer] timer bloqué par une boucle for?


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut [Timer] timer bloqué par une boucle for?
    Bonjour, j'essaye de développer une application permettant de récupérer des données venant d'une base de données Oracle. Je récupère donc une liste de requêtes que j'envoie dans une boucle for.
    Comme cela peut prendre du temps, je voudrais rajouter une indication sur le nombre de requetes restant et l'estimation du temps que cela va prendre. J'ai donc ajouté une fenetre qui contient quatres labels ayant pour unique but d'afficher le temps restant.
    Pour mettre à jour le temps restant, j'ai crée un timer que je démarre juste avant d'envoyer mes requêtes et qui est censé mettre à jour le label toutes les secondes en appellant une fonction maj().
    Mon problème est le suivant:
    La fenetre s'ouvre bien, mais rien ne s'affiche dedans, et la fonction maj() ne s'éxécute pas une seule fois pendant toute la durée de la boucle "for". Des que je sors du "for", le timer se met à tourner normalement et les labels apparaissent dans la fenetre.
    Est-ce un problème de ressources?

    Voici mon code:
    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
     
     
    JFrame framees = new JFrame("Please wait");
        framees.setSize(300, 300);
        elapsedlab = new JLabel("Elapsed time:");
        estimatedlab = new JLabel("Remaining time (estimation):");
        elapsedtime = new JLabel("0");
        estimatedtime = new JLabel("");
        pane = new JPanel();
        pane.setLayout(new GridLayout(2, 2));
        pane.add(elapsedlab);
        pane.add(elapsedtime);
        pane.add(estimatedlab);
        pane.add(estimatedtime);
        framees.getContentPane().add(pane, BorderLayout.NORTH);
     
        long millidebut = System.currentTimeMillis();
        milliactuel=millidebut;
        moy = 0;
        framees.show();
        nb=0;
        nbcount=menu.getRowCount();
     
        Timer timer = new Timer(1000, new ActionListener(){
          public void actionPerformed(ActionEvent e) {
            maj();
          }
        });
     
        timer.start();
        for(int i = 0; i<nbcount; i++)
        {
          String date = (String) menu.getValueAt(i, 1);
          if(isBefore(debut, date)>-1 && isBefore(date, fin)>-1)
          {
            String req3= req2;
            req3+= Integer.parseInt((String) menu.getValueAt(i, 0))+"\n";
            req3+= "AND COL<"+(menu2.getRowCount())+" ORDER BY lig, col\n";
            reqlist.add(new DbAccessMgt(null, cx, req3));
            dateslist.add(date);
          }
          nb=i;
          long dif = System.currentTimeMillis()-milliactuel;
          moy=(moy*nb+dif)/(nb+1);
        }
    Voici le détail de la fonction maj(), simplifiée pour l'occasion mais ça ne change rien au problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void maj()
      {
        System.out.println("tic tac");
      }
    La classe DbAccessMgt est une classe dont le constructeur envoie une requete à une connexion et qui permet de récupérer les informations sur cette requete.
    Merci d'avance!
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    C'est normal. Le javax.swing.Timer génère des événements dans l'EDT, que tu bloques avec ta boucle for. Il faut mettre cette boucle for dans un autre thread. Même sans le Timer, tu aurais des problèmes : tu bloquerais l'affichage, la souris, le clavier... Cf. mon article à ce sujet : http://gfx.developpez.com/tutoriel/j...ing-threading/
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Ah oui en effet ça marche mieux avec un thread en plus.
    Merci pour cette fac très interessante, j'avais jamais entendu parler de cette histoire de blocage de l'EDT, mais ça explique beaucoup de problèmes d'affichage que j'ai eu!
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  4. #4
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Ce problème est d'ailleurs la raison majeure qui fait croire aux gens que Swing est lent
    Romain Guy
    Android - Mon livre - Mon blog

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/10/2014, 11h33
  2. Parcourir une boucle for par pas différent de 1
    Par balix dans le forum Général Python
    Réponses: 4
    Dernier message: 17/05/2014, 14h00
  3. Fenêtre figée par une boucle FOR
    Par s.toubal dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 08/09/2011, 09h48
  4. Insérer <form> dans une boucle for et traiter par POST
    Par IRONicMAN dans le forum Langage
    Réponses: 10
    Dernier message: 26/03/2010, 14h09
  5. création des DDLs par une boucle for
    Par sophiesophie dans le forum C#
    Réponses: 27
    Dernier message: 29/05/2008, 11h29

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