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 :

Timer ou Thread.Sleep


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Timer ou Thread.Sleep
    bonjour,

    je cherche le meilleur moyen de créer des petites animations dans une winform.

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #if !TIMER
            private void DemarrerAnimation()
            {
                this._anim = true;
     
                using (Graphics g = Graphics.FromImage(this._fond))
                {
                    while (this._anim)
                    {
                        this.Dessiner(g);
                        System.Threading.Thread.Sleep(this._duree);
                    }
                }
            }
     
            private void ArreterAnimation()
            {
                this._anim = false;
            }
     
            private void Dessiner(Graphics g)
            {
                if (this._pos.X < 0 || this._pos.Y < 0 ||
                    (this._pos.X + 1) * this._taille + this._marge * 2 >= this.pictureBox1.ClientSize.Width ||
                    (this._pos.Y + 1) * this._taille + this._marge * 2 >= this.pictureBox1.ClientSize.Height)
                {
                    this._anim = false;
                    return;
                }
     
                g.Clear(Color.Transparent);
                g.FillEllipse(Brushes.Black,
                    this._marge + this._pos.X * this._taille,
                    this._marge + this._pos.Y * this._taille,
                    this._taille, this._taille);
     
                this.pictureBox1.Refresh();
                Application.DoEvents();
     
                switch (this._sens)
                {
                    case 'L': this._pos.X--; break;
                    case 'R': this._pos.X++; break;
                    case 'U': this._pos.Y--; break;
                    case 'D': this._pos.Y++; break;
                    default: break;
                }
            }
    #endif
     
            private void timer1_Tick(object sender, EventArgs e)
            {
    #if TIMER
                if (this._pos.X < 0 || this._pos.Y < 0 ||
                    (this._pos.X + 1) * this._taille + this._marge * 2 >= this.pictureBox1.ClientSize.Width ||
                    (this._pos.Y + 1) * this._taille + this._marge * 2 >= this.pictureBox1.ClientSize.Height)
                {
                    this.timer1.Stop();
                    return;
                }
     
                using (Graphics g = Graphics.FromImage(this._fond))
                {
                    g.Clear(Color.Transparent);
                    g.FillEllipse(Brushes.Black,
                        this._marge + this._pos.X * this._taille,
                        this._marge + this._pos.Y * this._taille,
                        this._taille, this._taille);
     
                    this.pictureBox1.Refresh();
     
                    switch (this._sens)
                    {
                        case 'L': this._pos.X--; break;
                        case 'R': this._pos.X++; break;
                        case 'U': this._pos.Y--; break;
                        case 'D': this._pos.Y++; break;
                        default: break;
                    }
                }
    #endif

    j'ai fait 2 versions que vous pouvez voir ci-dessus. les 2 fonctionnent bien.
    je ne sais pas quelle version doit être privilégiée. en utilisant le timer ou la boucle avec thread.sleep ?

    merci de vos commentaires/remarques sur ce code

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'utiliserai timer car il est non bloquant contrairement à thread.Sleep.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                this.pictureBox1.Refresh();
                Application.DoEvents();
    ce code permet de mettre à jour l'affiche et de ne pas bloquer l'appli

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Ce n'est pas parce que tu as une impression de fluidité qu'il n'y à pas de blocage.
    Imaginons que tu veux modifier l'image toutes les 2 secondes, tu constatera alors que Thread.Sleep bloque bien ton application, fait le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.pictureBox1.Refresh();
    Force le rafraichissement du control associé suite au blocage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DoEvents();
    Force le traitement des messages Windows et évènements de ton application suite au blocage.

    Si ton code n'était pas bloquant tu n'aurait pas besoin de ces 2 lignes.
    Par exemple, en exécutant ce code dans un thread supplémentaire, Thread.sleep ne bloquerait pas le Thread principal gérant l'interface graphique et les évènements.

    Voir : https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx
    Appel de cette méthode provoque le thread actuel est suspendu pendant le traitement de tous les messages de fenêtre en attente. Si un message provoque un événement soit déclenché, autres zones de votre code d'application peuvent s'exécuter. Cela peut amener votre application présentent des comportements inattendus qui sont difficiles à déboguer. Si vous effectuez des opérations ou des calculs qui prennent un certain temps, il est souvent préférable d'effectuer ces opérations sur un nouveau thread

  5. #5
    Invité
    Invité(e)
    Par défaut
    ma variable this._duree utilisée dans mon Thread.Sleep varie entre 10 et 150.
    je n'ai aucun blocage de mon appli, je peux modifier le déplacement en utilisant le clavier.

    à l'utilisation je n'ai pas de différences entre les 2 versions

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'ai fait un test simple avec Thread.Sleep 150, pour moi la différence est bien visible, bien sur il faut avoir l’œil.
    Quoiqu'il en soit si tu essaie avec Thread.Sleep 1000 il sera plus facile pour toi de le constater.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                while (true)
                {
                    Thread.Sleep(150);
                    Application.DoEvents();
     
                }
    Bref le code bloque et ce n'est pas propre.
    Lorsque je débutais j'utilisais aussi Application.DoEvents();
    Maintenant je m'en passe au maximum suite à des comportements indésirables, comme dit sur le lien MSDN que je t'ai donné.

    Après tu fait comme tu veux mais Thread.sleep bloque le thread courant

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/01/2013, 10h11
  2. Equivalent d'un thread.sleep à l'aide de timer
    Par lasrevinu dans le forum C#
    Réponses: 8
    Dernier message: 12/04/2010, 12h54
  3. Réponses: 5
    Dernier message: 03/03/2010, 13h27
  4. Réponses: 0
    Dernier message: 01/08/2008, 10h57
  5. Timers, boucles d'affichage et Thread.sleep
    Par Silk_do_Nadear dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 28/07/2007, 01h49

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