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

Java Discussion :

Problème avec un Timer/Thread


Sujet :

Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut Problème avec un Timer/Thread
    Bonjour,

    J'ai un petit problème de redondance en utilisant un Timer.
    Je développe une web application qui affiche une DataTable, mon but est de simuler un effet de défilement du contenu.
    Pour cela je sélectionne le premier élément de ma DataTable et je le place à la fin de la liste.
    Cet évènement est déclenché par un Timer. Normalement toute les 3 secondes le premier élément passe à la fin, hors dans mon cas c'est les 2 premiers éléments...
    J'ai testé avec le Timer "util" et le "swing", j'ai essayé aussi avec un Thread mais cela n'a rien changé.

    La DataTable est bindé sur la Liste lst.

    Voila le Timer qui est dans la fonction init() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Timer t = new Timer();
    t.schedule(new TimerTask() {
        public void run() {
     
        Ical tampon = (Ical) lst.get(0);
        lst.remove(tampon);
        lst.add(tampon);
     
        // Permet de rafraichisement automatique de la DataTable
        edT.requestRender();
        }
    },0,3000);
    J'utilise NetBeans 6.5 avec TomCat 6.0 et des éléments IceFaces pour l'affichage

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    tu n'est pas obligé de faire un get() avant le remove:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Ical tampon = (Ical) lst.remove(0);
        lst.add(tampon);
    sinon, pour ton erreur, tu peux essayer de tracer le contenu de ta liste avant et apres ces deux-lignes la.
    1°er possibilité: les traces montrent qu'il n'y a qu'une suppression, mais il le fait 2* trop souvent -> tu as deux timers de lancés
    2°eme possibilité: les traces montrent qu'il n'y a qu'une suppression, mais un autre élément se met en fin de liste entre chaque appel. -> tu as mit ce code autre part, fait une recherche.
    3° possibilité: les traces montrent que deux éléments sont supprimés et remis dans la liste -> la solution est a chercher dans les methodes remove et add de lst (a mon avis)

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Il serait peut-être utile que tu précise d'avantage le contexte.

    Tu parles d'application web. Il semblerait donc que ce code est exécute coté serveur. A moins que ce code soit celui d'une applet, le client ne véra pas la modification sur sa page tant qu'elle n'est pas rechargée.

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour et merci de vos réponse,

    Pour ce qui est de la trace, voila ce que j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void run() {
                        Ical tampon = (Ical) lst.get(0);
                        System.out.println("retirer");
                        lst.remove(tampon);
                        System.out.println("add");
                        lst.add(tampon);
                        System.out.println("i :"+i);
                        i++;
     
                        personGroup.requestRender();
                }
    La sortie sur la console donne :
    retirer
    add
    i :0
    retirer
    add
    i :1
    retirer
    add
    i :1
    retirer
    add
    i :2
    retirer
    add
    i :2
    retirer
    add
    i :3
    retirer
    add
    i :3
    retirer
    add
    i :4
    retirer
    add
    i :4
    ...
    Pour le contexte je ne sais pas quoi vous donner de plus je n'ai pas beaucoup de code.
    L'autre partit de mon code permet de récupérer des données d'un fichier *.ics et ce code fonctionne correctement. (Au passage si ça intéresse quelqu'un je peux le poster)

    J'ai aussi l'affichage en jsp :
    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
     
    <ice:dataTable binding="#{Page1.dataTable2}" id="dataTable2" rows="10" style="left: 134px; top: 38px; position: absolute"
                                value="#{Page1.lst}" var="ical" width="767">
                                <f:facet name="header"/>
                                <f:facet name="header"/>
                                <ice:column id="column4">
                                    <ice:panelGroup effect="#{ical.newItemEffect}">
                                        <ice:outputText id="outputText8" value="#{ical.desc}" />
                                    </ice:panelGroup>
                                    <f:facet name="header">
                                        <ice:outputText id="outputText9" value="Description"/>
                                    </f:facet>
                                </ice:column>
                                <ice:column id="column5">
                                    <ice:outputText id="outputText10" value="#{ical.dtstart}"/>
                                    <f:facet name="header">
                                        <ice:outputText id="outputText11" value="Début"/>
                                    </f:facet>
                                </ice:column>
                                <ice:column id="column6">
                                    <ice:outputText id="outputText12" value="#{ical.dtend}"/>
                                    <f:facet name="header">
                                        <ice:outputText id="outputText13" value="Fin"/>
                                    </f:facet>
                                </ice:column>
                            </ice:dataTable>
    Voila pour Uther.
    Mettre Ical tampon = (Ical) lst.remove(0); n'arrange pas la chose mais ça fait une ligne en moins

    Après avoir lancé mon programme en mode débug, je me suis rendu compte qu'il lancé 2 fois le Timer. (Merci Merill)
    Maintenant il me reste à faire un test pour corriger ça ^^'

    Je vous tiens au courant si je trouve une solution.

    Bonne journée et encore merci \o/

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bon en fait j'ai utilisé un "if" tout simplement
    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
     
    if(t == null){
                t = new Timer();
                t.schedule(new TimerTask() {
                    Integer i = 0;
                    public void run() {
                            Ical tampon = (Ical) lst.remove(0); //lst.get(0);
                            //System.out.println("retirer");
     
                            //System.out.println("add");
                            lst.add(tampon);
                            System.out.println("i :"+i);
                            i++;
     
                            personGroup.requestRender();
                    }
     
                },0,3000);
            }
    Mais je ne comprend toujours pas pourquoi il passait 2 fois dans l'init()
    Quelqu'un à une explication logique à ça ?

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

Discussions similaires

  1. [Problème avec les Timers]
    Par ARachid dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2007, 18h47
  2. Problème avec les timers
    Par Mouse Slider dans le forum SDL
    Réponses: 5
    Dernier message: 22/08/2006, 09h34
  3. [Débutant]Problème avec un timer
    Par Fabouney dans le forum C
    Réponses: 10
    Dernier message: 10/08/2006, 19h25
  4. Problème avec un Timer
    Par francky23012301 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 09/05/2006, 11h25
  5. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 11h00

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