Aller au menu - Aller au contenu

Icône Les timers

Avatar
Mise à jour : 13/12/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
23 410 visites depuis 7 jours, dont 508 sur ce chapitre classé 14/786
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

A quoi ca va nous servir ?

Vous devez bien vous demander à quoi ca va nous servir même si le nom explique déjà beaucoup.

Un timer nous sera très utile pour effectuer des actions temporelles et réagir à des évènements temporels.

Exemple : notre horloge que nous avons fait dans la partie 1 qui prenait la date actuelle et l'affichait, eh bien avec un timer on pourrait prendre la date actuelle et ajouter une seconde toutes les secondes. Même effet mais pas la même façon.

Autre exemple : faire déplacer une image ou un objet tout les x millisecondes (utile pour les jeux ou animations)

Ce timer est un contrôle comme n'importe quel bouton ou textbox, mais au lieu de pouvoir le placer ou l'on veut dans la fenêtre, il se met "en dehors" de cette fenêtre puisqu'il n'est pas visible à l'exécution.

Apprenons dès maintenant à l'utiliser.

Créer son premier timer

Créons notre premier timer : double-cliquons donc sur son contrôle pour le voir se placer en bas de notre fenêtre design.

Essayez de construire le reste de l'application comme moi :

Image utilisateur

Donc, nous avons 2 boutons : un démarrer nommé BT_DEMAR, un RAZ nommé ..... BT_RAZ.
Une progressbar : PGB_TIM, et un timer (non visible à l'image) nommé TIM_TIM.

J'explique ce que notre programme va faire : lors de l'appui sur le bouton démarrer, la progressbar va progresser jusqu'au bout de manière linéaire et à une certaine vitesse, sur RAZ, elle va retourner à 0.

Le timer contient 2 propriété essentielles : enabled, comme tout les autres contrôles détermine s'il est activé ou non, et la propriété interval (ce n'est pas une marque de cigarettes, non) cette propriété va déterminer l'intervalle entre 2 actions du timer (exprimée en ms).

Mettons donc pour ce tp 20ms d'intervalle.

A chaque fois que ce temps sera écoulé, l'évènement du timer nommé tick se déclenchera. Pour créer cet évènement sur l'assistant, double-cliquez sur le timer, en bas. Faites de même pour les évènements des 2 boutons.

Nous avons donc les 3 évènements de crées dans notre code : le timer et les 2 boutons.

Je pense que vous êtes capables de faire cet exercice seul, avec tout ce que vous savez mais je vais quand même vous le faire.

Code : VB.NET
 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
Public Class Form1
    Private Sub BT_DEMAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_DEMAR.Click
        'Si le bouton démarrer est enfoncé, on active le timer, on désactive ce bouton et on active RAZ
        Me.TIM_TIM.Enabled = True
        Me.BT_DEMAR.Enabled = False
        Me.BT_RAZ.Enabled = True
    End Sub

    Private Sub TIM_TIM_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_TIM.Tick
        'Si la progressbar est arrivée au bout, on désactive le timer, on réactive le bouton démarrer
        If Me.PGB_TIM.Value = 100 Then
            Me.TIM_TIM.Enabled = False
            Me.BT_DEMAR.Enabled = True
        Else
            'Augmente de 1 la progressbar
            Me.PGB_TIM.Value = Me.PGB_TIM.Value + 1
        End If
    End Sub

    Private Sub BT_RAZ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_RAZ.Click
        'Si le bouton RAZ est enfoncé, on remet la progressbar à 0, on désactive le timer, 
        'on active le bouton démarrer et on désactive le bouton RAZ
        Me.PGB_TIM.Value = 0
        Me.TIM_TIM.Enabled = False
        Me.BT_DEMAR.Enabled = True
        Me.BT_RAZ.Enabled = False
    End Sub
End Class


J'ai fait l'effort de commenter le code pour une fois :p

Bon, je pense que ce n'était pas si dur que ca, vous voyez que je me sers de l'évènement du timer, donc déclenché toutes les 20ms dans notre cas pour ajouter 1 à la value de la progressbar. Si la value arrive à 100, on l'arrête.

Je pense que vous avez compris que si je diminue l'intervalle, la progressbar progressera plus vite.

TP : la banderole lumineuse

Petit TP : la banderole lumineuse.

Bon le nom n'est pas très imaginatif ... Je sais.

Le but de ce TP va être d'allumer différents RadioBoutons (une dizaine) au rythme du timer, les faire défiler en gros. J'ai pris des radioboutons et pas des chkbox, parce que les radiobouton n'ont pas besoin d'être décochés, ils le font automatiquement lorsqu'un autre est coché.

Donc un bouton démarrer et arrêter la banderole seront nécessaires.

Et petit plus pour les rapides : une barre pour faire varier la vitesse de ce défilement.

Attention ce TP n'est pas aussi facile qu'il en a l'air !
Essayez de trouver une méthode pour pouvoir gérer aussi bien 10 boutons que 50.

Petite astuce : il va falloir faire un tableau ... Mais de quoi ? That's the question.

A vos claviers !

Solution



Bon alors, tout d'abord à quoi il ressemble mon programme ?

A ça :

Image utilisateur


Il y a bien les 10 Radioboutons.

Maintenant le code :

Secret (cliquez pour afficher)
Code : VB.NET
 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
Public Class Form1
    Private Sub TIM_TIM_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_TIM.Tick
        Dim Tourne As Boolean = True
        Dim Bouton As Integer = 0

        'Rassemble tous les radioboutons dans un tableau
        Dim RB(9) As RadioButton
        RB(0) = Me.RB_1
        RB(1) = Me.RB_2
        RB(2) = Me.RB_3
        RB(3) = Me.RB_4
        RB(4) = Me.RB_5
        RB(5) = Me.RB_6
        RB(6) = Me.RB_7
        RB(7) = Me.RB_8
        RB(8) = Me.RB_9
        RB(9) = Me.RB_10

        While Tourne
            'Si on est arrivé au bout du tableau, on sort de cette boucle
            If Bouton = 10 Then
                Tourne = False
            Else
                'Si le bouton actuellement parcouru est activé
                If RB(Bouton).Checked Then
                    'Et si ce n'est pas le dernier
                    If RB(Bouton) IsNot RB(9) Then
                        'on active celui d’après et on sort de la boucle
                        RB(Bouton + 1).Checked = True
                        Tourne = False
                    Else
                        'Sinon on reprends au premier
                        Me.RB_1.Checked = True
                    End If
                End If
                'On incrémente le compteur
                Bouton = Bouton + 1
            End If
        End While
    End Sub

    Private Sub BT_PLAY_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_PLAY.Click
        Me.TIM_TIM.Enabled = True
        Me.TIM_TIM.Interval = 501 - Me.TKB_VIT.Value * 50
    End Sub

    Private Sub BT_STOP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_STOP.Click
        Me.TIM_TIM.Enabled = False
    End Sub

    Private Sub TKB_VIT_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TKB_VIT.Scroll
        Me.TIM_TIM.Interval = 501 - Me.TKB_VIT.Value * 50
    End Sub
End Class


Alors je vais expliquer le principal :

Vous voyez que dans l'évènement tick du timer j'ai crée un tableau, mais ce n'est pas un tableau de string ou de integer, non c'est un tableau de ... Dim RB(9) As RadioButton RadioButton !

Eh, oh je savais pas moi !

C'est pour ça que j'ai dit que ce TP était difficile, en cherchant un peu vous auriez pu avoir l'idée, ensuite la mettre en pratique aurait été faisable ...

Bon Ce n'est pas grave vous le saurez maintenant. Donc ce tableau de radioboutons ,je le remplit avec mes boutons !

Et donc si vous avec compris, la boucle en dessous est un petit algorithme qui parcours ces boutons et qui retourne au premier une fois arrivé au dernier.

Passons maintenant au changement de vitesse : Me.TIM_TIM.Interval = 501 - Me.TKB_VIT.Value * 50. Mais pourquoi ? tout d'abord ma progressbar a un minimum de 1 et un maximum de 10.
Donc, à 1 : 501 - 1 * 50 = 451 et à 10 : 501 - 10 * 50 = 1.

La vitesse change donc bien en fonction de cette barre.

Et pourquoi 501 et pas 500 ?

Parce que 500 - 10 * 50 = 0, et l'interval d'un timer ne doit jamais être égal à 0 !

Pour finir ce chapitre, je tien à dire que l'amélioration de ce TP peut être effectuée en de multiples points. Tout d'abord, le code lors du Tick du Timer est beaucoup trop conséquent, il faut au contraire qu'il soit le plus petit possible pour ne pas demander trop de mémoire au processeur. Donc les déclarations sont à effectuer au Load.
Et profitez-en pour factoriser ce petit algorithme qui fait défiler les RadioButtons =).

Q.C.M.

Quel évènement sera appelé à chaque fois que l'interval du timer sera écoulé ?
Une erreur ?

Code : VB.NET
1
Me.MonTimer.Interval = 0

Statistiques de réponses au QCM

Chapitre précédent Sommaire Chapitre suivant

Partager

10 commentaires pour "Les timers"
Note moyenne : 3.60 / 4 (543 votes)
Pseudo Commentaire
Hors ligne Maws # Posté le 24/02/2011 à 16:17:09
Hein?
Avatar

Ville : Tourcoing
Pays : France métropolitaine
Études : Lycée Gambetta - Tourcoing

Moi j'ai fais ca:

Code : VB.NET
 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
Public Class Form1


Private Sub BT_DEMAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_DEMAR.Click
        If Me.TIM_TIM.Enabled = False Then
            Me.TIM_TIM.Enabled = True
        Else
            Me.TIM_TIM.Enabled = False
        End If

    End Sub

    Private Sub BT_RAZ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_RAZ.Click
        Me.PGB_TIM.Value = 0
    End Sub

    Private Sub TIM_TIM_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_TIM.Tick
        If Me.PGB_TIM.Value = 100 Then
            Me.TIM_TIM.Enabled = False
        Else
            Me.PGB_TIM.Value += 1
        End If

    End Sub
End Class


Et ça fonctionne apparemment...

*Vous rigolez de moi parce que je suis différent de vous mais je rigole de vous parce que vous êtes tous pareil*
 
Hors ligne CapitainMiller # Posté le 11/03/2011 à 00:06:50
Avatar

Ville : Nancy
Pays : France métropolitaine

Bonjour,

J'ai une toute petite question. Plus je diminue la valeur de "l'interval", plus ma barre de progression se stop loin de la fin de la barre. C'est normal ou pas ?
Hors ligne remi500cl # Posté le 13/06/2011 à 20:03:55

Avis : Très bon

Ville : Dunkerque
Pays : France métropolitaine

Autre solution pour le TP : la banderole lumineuse :-° :
Code : VB.NET
 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
Public Class Banderole

    Dim collection As New Collection
    Dim i As Integer = 1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        collection.Add(rad1, 1)
        collection.Add(rad2, 2)
        collection.Add(rad3, 3)
        collection.Add(rad4, 4)
        collection.Add(rad5, 5)
        collection.Add(rad6, 6)
        collection.Add(rad7, 7)
        collection.Add(rad8, 8)
        collection.Add(rad9, 9)
        collection.Add(rad10, 10)
        collection.Add(rad11, 11)
        collection.Add(rad12, 12)
        collection.Add(rad13, 13)
        collection.Add(rad14, 14)
        collection.Add(rad15, 15)
        collection.Add(rad16, 16)
    End Sub

    Private Sub btn_demarrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_demarrer.Click
        timer.Enabled = True
    End Sub

    Private Sub btn_stop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_stop.Click
        timer.Enabled = False
    End Sub

    Private Sub TrackBar_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bar.Scroll
        timer.Interval = bar.Value
    End Sub

    Private Sub timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer.Tick
        i = IIf(i = 16, 1, i)
        Dim rad_fin As RadioButton = collection.Item(i)
        rad_fin.Select()
        Dim rad_debut As RadioButton = collection.Item(i + 1)
        rad_debut.Select()
        i += 1
    End Sub

End Class
Hors ligne Nasura # Posté le 16/06/2011 à 12:06:27
Avatar

Avis : Mitigé

Études : ITIN

Citation : Hankerspace
While Tourne
'Si on est arrivée au bout du tableau, on sort de cette boucle


Ici aussi il y a une faute d'orthographe dans le commentaire : si on est arrivée (ligne 20 du code de la banderole lumineuse)

Voila, sinon bon tuto en général bien que je ne sois pas encore au bout.
Hors ligne Pierre-Olivier Pigo # Posté le 29/01/2012 à 11:15:14

Moi j'ai un petit probleme avec la variable "Value" du timer, en effet de base elle n'existe pas!!!!
preuve en image!

Voir tous les commentaires