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

AWT/Swing Java Discussion :

Tuer un timer


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Tuer un timer
    Bonjour,

    je déclare un timer dans une Jdialog.

    Ce timer démarre à l'ouverture de la fenètre, et doit s'arrêter et être détruit à sa fermeture.

    Je ferme cette fenetre via this.dispose();

    Or je constate qu'en faisant comme ca, le timer reste vivant même après la fermeture de cette fenetre.

    Comment est ce possible?

    Faut il le finaliser pour résoudre le problème?
    Sachant que je pourrait très bien faire MonTimer.stop(), mais je ne suis pas sur que l'objet soit bien effacé de la mémoire, à moins que le garbage collector voit quand un objet n'est plus actif et le vire automatiquement?

    Aidez moi svp, car comme mon appli est déjà gourmande en mémoire, je voudrai l'alléger un peu.

    Merci

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tant que le Thread n'a pas terminé son traitement, il va rester vivant et en mémoire.
    Quel est le code de ton timer ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut 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
    private Timer createTimer (){
        ActionListener action = new ActionListener (){
            public void actionPerformed(ActionEvent event){
                if(compteur < 240){
                    transactions.setListData(datas.getTransactions());
                    repaint();
                    compteur++;
                }
                else{
                    timer.stop();
                    timer = null;
                    alerte(); //JDialog "Temps dépassé"
                }
            }
        }
    }

    Il sert à rafraichir un l'affichage des transactions en cours sur DB2, et à décompter 20 min de connexion max sur l'interface
    merci

  4. #4
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Desolé
    J'avais zappé une partie :
    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
    private Timer createTimer (){
    	ActionListener action = new ActionListener (){
    		public void actionPerformed (ActionEvent event){
    			if(compteur < 240){					transactions.setListData(datas.get_Transactions());
    				repaint();
    				compteur ++;
    			}
    			else{
    				timer.stop();
    				timer = null;
    				alerte();
    			}
    		}
    	};
    	return new Timer (5000, action);
    }

  5. #5
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Salut,

    Je ferme cette fenetre via this.dispose();

    Or je constate qu'en faisant comme ca, le timer reste vivant même après la fermeture de cette fenetre.

    Comment est ce possible?
    Le Timer est un processus qui est indépendant de tous les autres une fois crée. Si tu veux résoudre le problème, esaie de le déclarer Daemon. Cela signifie qu'il sera détruit si plus aucune application provenant de ton code ne s'exécute. ça ne marchera pas si ton programme continue de tourner (encore des calculs en cours, d'autres fenêtres...) après la fermeture de ta JDialog.

    Sachant que je pourrait très bien faire MonTimer.stop(), mais je ne suis pas sur que l'objet soit bien effacé de la mémoire, à moins que le garbage collector voit quand un objet n'est plus actif et le vire automatiquement?
    Si tu fais monTimer.stop(), alors il stoppera l'écoute des évènements qui jusqu'alors déclanchaient ses actions. Mais ton Timer ne sera pas mort pour autant, tu peux toujours faire la méthode restart() pour t'en convaincre. De plus, si ton Timer arrête d'écouter les évènements, il continuera quoiqu'il arrive d'exécuter sa méthode actionPerformed().
    Par contre, si plus rien ne pointe sur ton objet, le GarbageCollector s'en chargera :-)

    A mon avis, le plus simple est de faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void killTimer() {
         killTimer=true;
    }
     
    public void actionPerformed(ActionEvent evt) {
         if(getKillTimer()) {
              return;
         } else {     
              //...Perform a task...
         }
    }
    Lorque ton Timer a finit d'exécuter la méthode run(), tu peux alors le finaliser.

    J'espère t'avoir aidé ;-)

    Cordialement

  6. #6
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Comment
    Comment faire pour le finaliser?


    C'est la que je ne sais pas faire... pas l'habitude avec java.

    "plus rien ne pointe sur le timer" ca signifie timer = null; ou c'est plus compliqué?

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

Discussions similaires

  1. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  2. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  3. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  4. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59
  5. [VB6] [Système] Tuer un processus courant
    Par mdoyer dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 22/10/2002, 14h47

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