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

C# Discussion :

Faire attendre le Thread courant


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut Faire attendre le Thread courant
    Bonjour,
    j'ai un soucis. J'ai une animation qui fait bouger un pion de bas en haut dans la fonction Paint() d'une PictureBox, mais elle va bien trop vite. J'ai donc penser à chaque affichage de l'image de mettre un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.Sleep(...); // Une durée quelconque
    Mais cela ne marche pas du tout. J'ai l'impression que ça attend 2 à 3 secondes et le pion s'affiche tout en bas.
    Quelqu'un aurait une idée pour ralentir mon animation à chaque affichage de mon image ?
    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ce n'est pas dans le Paint qu'il faut faire le déplacement...
    L'évènement Paint est appelé quand la PictureBox doit être rafraichie. Si tu mets des Sleep à cet endroit, le dessin va prendre des plombes et bloquer toute l'interface.
    Utilise plutôt un Timer, dans lequel tu fais varier la position et tu appelles Invalidate sur la PictureBox pour la forcer à se redessiner

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ok, je vois. Je ne sais pas gérer les Timer surtout qu'il faut utiliser les délégués, un truc que je n'ai pas encore compris. Aurais-tu un exemple de code ou un tuto pour m'aider ?
    Et comment puis-je gérer la coordonnée d'un pion dans une autre méthode ? J'appelle cette méthode quand ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Tu n'as pas besoin de connaitre les delegates pour utiliser un Timer, le designer fait tout pour toi... C'est bête comme tout :
    - tu poses un Timer sur ta Form (catégorie "Composants" de la boîte à outils)
    - tu définis sa période (propriété Interval) en millisecondes
    - tu doubles-cliques dessus, ça génère un handler pour l'évènement Tick qui se produit toutes les <Interval> millisecondes, et dans lequel tu mets le code de déplacement
    - pour démarrer le timer, tu mets sa propriété Enabled à true (ou tu appelles sa méthode Start, c'est pareil)

    Pour que les coordonnées soient disponibles dans toute la classe, déclares les comme membres de la classe (directement dans le corps de la classe)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Merci tomlev, je viens d'incorporer un Timer sur ma fenetre et fais toutes les étapes que tu m'as indiqué. Mais maintenant, j'ai un autre soucis, quand dois-je déclencher le Timer avec sa méthode start() ?
    - Quand je clique pour poser un pion sur le plateau
    - Quand je repains ma pictureBox (je pense pas...)

    Pour l'instant, je l'ai mis quand je clique sur ma pictureBox pour poser un pion. Le soucis, c'est que j'aimerais qu'il se relance dès que je clique de nouveau sur la pictureBox, et ça ne marche pas (que le timer est fini de compter ou pas ).
    J'ai essayé : (quand je clique pour poser un pion)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Réinitialise le timer
    this.timer1.Enabled = false; // ou this.timer1.Stop()
    // Démarre le Timer
    this.timer1.Start();
    P.S : Voici ma méthode Tick() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void timer1_Tick(object sender, EventArgs e)
    {
            int arretPion = partie.GetPlateau().getDernierCoupX() * hauteurCase; // quand il faut arreter le pion
            if (coordonnePionAnime <= arretPion)
            {
                // Incrémente la coordonnée du pion qui descend
                coordonnePionAnime++;
                // Affiche l'incrémentation (pour controler)
                this.label1.Text = coordonnePionAnime.ToString();
                // Rafraîchit le plateau de jeu
                this.pictureBox5.Invalidate();
           }
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je comprends pas bien le problème... une fois que tu as démarré le timer, tu n'as plus besoin de le relancer (à moins que tu l'aies arrêté entre temps...)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    En effet, tu as raison. Logiquement, je n'ai pas à l'arrêter. De plus, il gèlera surement mon GUI pendant l'exécution donc ce n'est pas un soucis, c'était juste pour contrôler.
    Ce que je n'arrive pas à faire, c'est relancer le Timer une fois qu'il est terminé. Quand je reclique sur ma pictureBox, je relance le Timer, mais il ne se relance pas.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    En fait, je n'avais pas compris le fonctionnement du Timer. C'est pour ça que je voulais le réinitialiser à chaque clic sur ma pictureBox, mais c'est la variable que j'incrémente qu'il fallait que je réinitialise, pas le Timer. Apparemment, le Timer se lance dans un Thread et ne se termine que lorsque l'application se ferme.
    Merci pour vos réponses !

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

Discussions similaires

  1. Faire attendre un Thread Tomcat qu'un autre Thread finisse son action
    Par n2engineer5 dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 21/03/2013, 14h39
  2. faire attendre un programme qu'un événement se déclenche
    Par fabrisss dans le forum API standards et tierces
    Réponses: 20
    Dernier message: 21/10/2005, 15h34
  3. [Serveur J2EE] Faire tourner un thread dans un serveur d'applications
    Par Pierre-Yves VAROUX dans le forum Java EE
    Réponses: 3
    Dernier message: 13/10/2005, 14h10
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01

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