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 ME Discussion :

Créer une fonction d'attente


Sujet :

Java ME

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 60
    Par défaut Créer une fonction d'attente
    Bonjour,
    dans mon programme, j'aimerais faire une fonction qui permet d'attendre pendant 5 secondes avant d'exécuter la fonction d'après.

    Le programme affiche un texte ( intro() ).
    Le programme laisse l'affichage précédent pendant 5 secondes.
    Le programme passe à l'affichage suivant ( suite() ).

    Si vous avez des idées pour implémenter la fonction attente(int nbSecondes). (sans passer par un Thread...?)
    Merci.

    Code Testeur.java : 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
    60
    61
    62
     
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class Testeur extends MIDlet{
    	private Display _display;
    	private Moteur _moteur;
     
    	public Testeur(){
    		_moteur = new Moteur();
    		_display = Display.getDisplay(this);
    	}
     
    	public void startApp(){
    		_display.setCurrent(_moteur);
    	}
     
    	public void pauseApp(){
    	}
     
    	public void destroyApp(boolean unconditional){
    	}
    }
     
    class Moteur extends Canvas{
    	public Moteur(){
    	}
     
    	protected void paint(Graphics g){
    		intro(g); 
    		attente(5); 
    		// Attente de 5 secondes afin de pouvoir
    		// faire une transition lente
    		// entre les deux fonctions
    		suite(g);  
    	}
     
    	private void intro(Graphics g){
    		g.setColor(0,0,0); 
    		// Noir
    		g.fillRect(0, 0, 128, 142); 
    		// Dessine un rectangle 128*142 rempli en noir
    		g.setColor(255,0,0); 
    		// Rouge
    		g.drawString("Veuillez patienter", 0, 0, Graphics.TOP|Graphics.LEFT); 
    		// Ecrit la chaine en rouge
    		g.drawString("5 secondes...", 0, 15, Graphics.TOP|Graphics.LEFT);
    	}
     
    	private void suite(Graphics g){
    		g.setColor(0,0,0);
    		g.fillRect(0, 0, 100, 100);
    		g.setColor(255,0,0);
    		g.drawString("Merci d'avoir", 0, 0, Graphics.TOP|Graphics.LEFT);
    		g.drawString("patienté.", 0, 15, Graphics.TOP|Graphics.LEFT);
    	}
     
    	private void attente(int nbSecondes){
    		// Fonction qui permet de "ne rien faire" 
    		// pendant nbSecondes secondes
    	}
    }

  2. #2
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Par défaut
    Le timer me semble tout a fait approprié, même si celui-ci implemente Thread me semble t-il la classe est facile d-utilistation.
    Donc regarde Timer, TimerTask et la fonction schedule de Timer.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 60
    Par défaut
    J'ai plutôt utilisé la fonction getTime() de la classe Date.
    La fonction attente(int nbSecondes) s'exécute bien pendant nbSecondes, mais l'appel à la fonction intro(g) ne dure pas nbSecondes.
    J'ai fait :
    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
     
    protected void paint(Graphics g){
    		intro(g); 
    		// Pour afficher le texte d'intro
    		attente(5);
    		// Pour laisser le texte d'intro affiché
    		// pendant 5 secondes
    		suite(g);
    		// Pour afficher le texte de fin
    }
    private void attente(int nbSecondes){
    		// Fonction qui permet de "ne rien faire" 
    		// pendant nbSecondes secondes
    		int attente = nbSecondes*1000; 
    		// Temps d'attente en millisecondes
    		date = new Date();
    		long debut = date.getTime();
    		// Récupère la date courante en millisecondes 
    		// (depuis January 1, 1970, 00:00:00 GMT)
    		long somme = debut + attente;
    		// Date à laquelle on sortira de la fonction
    		// (donc nbSecondes plus tard)
    		while(debut<somme){
    			date = new Date();
    			debut = date.getTime();
                            // La date courante change à chaque appel
                            // du constructeur Date().
                            // On sort de la boucle 5 secondes
                            // plus tard ici
    		}
    	}
    Alors, j'ai pensé faire l'appel à intro(Graphics g) dans la boucle de la fonction attente(int nbSecondes), ajoutant comme paramètre Graphics g.
    J'ai fait :
    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
     
    protected void paint(Graphics g){
    		attente(5,g);
    		suite(g);
    }
    private void attente(int nbSecondes, Graphics g){
    		int attente = nbSecondes*1000; 
    		date = new Date();
    		long debut = date.getTime();
    		long somme = debut + attente;
    		while(debut<somme){
    			date = new Date();
    			debut = date.getTime();
    			intro(g);
    			// Pour essayer d'appeler intro(g) 
    			// durant 5 secondes
    		}
    	}
    }
    Mais là encore, j'obtiens la même chose :
    - l'affiche de intro(g) a lieu mais il dure de l'ordre du millième de seconde (je suppose que le texte d'intro s'est affiché sans le voir).
    - l'appel à attente(5,g) dure bien 5 secondes mais l'affichage du texte d'intro n'a pas lieu.
    - et juste après, l'affichage du texte de fin (suite(g)) a lieu et reste affiché tout le temps.

    Serait-il mieux de créer une classe MyThread extends Thread dans laquelle je place intro(g) et une deuxième fonction paint(Graphics g) ? Mais dans ce cas, on aurait deux fonctions paint(g)...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2004
    Messages : 187
    Par défaut
    La solution de Peter p@n ! avec les TimerTask est de loin la meilleure solution à suivre, et n'entraîne pas forcément l'utilisation de 2 Canvas mais juste l'appel à un repaint.

  5. #5
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Par défaut
    Bon j'ai fais ça vite fait un peu à l'arrache :

    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
    import javax.microedition.lcdui.Display;
    import javax.microedition.midlet.*;
     
    /**
     * @author geoffrey
     */
    public class Testeur extends MIDlet {
     
        private Display _display;
        private Moteur _moteur;
        private int statut = 0;          //petite nouveauté un statut pour me simplifier la vie
     
        public Testeur(){
            _moteur = new Moteur(this);
            _display = Display.getDisplay(this);
        }
     
        public void startApp() {
            _display.setCurrent(_moteur);
        }
     
        public void pauseApp() {
        }
     
        public void destroyApp(boolean unconditional) {
        }
     
        public int getStatut() {
            return statut;
        }
     
        public void setStatut(int statut) {
            this.statut = statut;
        }
     
     
    }
    hop le moteur avec une méthode action qui va definir le statut puis reafficher
    grace à la méthode repaint() :

    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
    import java.util.Timer;
    import javax.microedition.lcdui.*;
     
    public class Moteur extends Canvas{
     
        private Timer _timer;
        private MyTimerTask _myTimerTask;
        private Testeur _testeur;
     
        public Moteur(Testeur t) {
            _testeur = t;
            _timer = new Timer();
            _myTimerTask = new MyTimerTask(this);
        } 
     
        public void paint(Graphics g) {
     
            if (_testeur.getStatut()==0){
                intro(g);
            }else if (_testeur.getStatut()==1){
                suite(g);
            }
     
     
        }
     
        private void intro(Graphics g){
    		g.setColor(0,0,0);
    		// Noir
    		g.fillRect(0, 0, 128, 142);
    		// Dessine un rectangle 128*142 rempli en noir
    		g.setColor(255,0,0);
    		// Rouge
    		g.drawString("Veuillez patienter", 0, 0, Graphics.TOP|Graphics.LEFT);
    		// Ecrit la chaine en rouge
    		g.drawString("5 secondes...", 0, 15, Graphics.TOP|Graphics.LEFT);
     
                         _timer.schedule(_myTimerTask, 5000);  //ici je dis de faire une pause de 5000 ms en utilisant ma classe myTimerTask
    	}
     
    	private void suite(Graphics g){
    		g.setColor(0,0,0);
    		g.fillRect(0, 0, 100, 100);
    		g.setColor(255,0,0);
    		g.drawString("Merci d'avoir", 0, 0, Graphics.TOP|Graphics.LEFT);
    		g.drawString("patienté.", 0, 15, Graphics.TOP|Graphics.LEFT);
    	}
     
        public void action(){
            _testeur.setStatut(1);
            repaint();
        }
    }
    et ma classe TimerTask, qui comme tu peut le voir ne fait pas grand chose
    puisqu'elle appelle juste la fonction action() de la classe Moteur :

    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
     
    import java.util.TimerTask;
     
    /**
     *
     * @author geoffrey
     */
    public class MyTimerTask extends TimerTask{
     
        private Moteur _moteur;
     
        public MyTimerTask(Moteur moteur){
            _moteur = moteur;
        }
        public void run() {
            _moteur.action();
        }
     
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 60
    Par défaut
    Pour du travail fait à l'arrache, c'est pas si mal !
    Bonne idée l'entier status avec le Timer pour la méthode schedule() et le TimerTask.
    Merci, j'ai mal exploré les pistes que vous m'aviez donné.

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

Discussions similaires

  1. Créer une fonction
    Par Jeffboj dans le forum Access
    Réponses: 7
    Dernier message: 15/04/2006, 20h49
  2. Créer une Fonction recherche sur Access
    Par remwideco dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2006, 10h36
  3. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  4. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

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