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

VB.NET Discussion :

Timer et boucle


Sujet :

VB.NET

  1. #21
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    et n'accèpte pas "Me.Right = Me.Right + 5
    Il existe toujours plusieurs méthodes , mais ta boucle ressemble à une usine à gaz (plus de 30 lignes) alors qu'avec le timer 4 lignes suffises
    C'est pour ça qu'au début, j'ai écrit ce bout "de rien du tout" sans timer, sans do/loop (pour ce que stracoma voulait faire) ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i As Integer = Me.Location.X To (Screen.PrimaryScreen.Bounds.Width - Me.Width)
           Dim Emplac As Point = New Point(i, Me.Location.Y) : Me.Location = Emplac
           Threading.Thread.Sleep(1)
    Next
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  2. #22
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Je retourne à ma boucle.
    rv26t
    Plusieurs problèmes surviennent dans ton code.
    1er - ta boucle "Do ... Loop ..." accapare la main et ne donne pas accès au reste du code (le timer ne court-circuite pas ta boucle et la fenêtre reste à sa place)
    2ème - tu n'arrête pas le timer, si celui-ci est déclencher à chaque Tick il va indéfiniment pousser ta fenêtre.
    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
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Left = 0
            Me.Top = 0
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Me.Left += 5 ' cette instruction est exéutée tant que Me.Timer1.Enabled = True
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 50
            Do ' exécute d'abord
                Me.Timer1.Enabled = True  'donc  Me.Left = Me.Left + 5 (vaut 5)
                'puis je vérifie si 5<200, c'est True, donc je recommence la boucle
                'Quand Me.left arrive à 200, je sors de la boucle, Me.Timer1.Enabled devient false, l'incrémentation de s'arrête
            Loop While Me.Left < 200
     
        End Sub
     
    End Class
    Je ne trouve pas encore la chose qui m'échappe
    J'apprends la programmation pour le plaisir

  3. #23
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Je ne suis pas sur que nous parlons tous le même langage....
    Essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim Emplac As Point
            For i As Integer = Me.Location.X To (Screen.PrimaryScreen.Bounds.Width - Me.Width)
                emplac = New Point(i, Me.Location.Y) : Me.Location = Emplac
                Threading.Thread.Sleep(1)
            Next
        End Sub
    End Class
    Maintenant si tu veux absolument un timer ça peut se faire également.
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  4. #24
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    J'ai déjà un code qui marche. Et cette fenêtre qui se déplace est juste un exercice pour moi pour comprendre les boucles et le fonctionnement du timer. Je ne peux pas adopter un autre code, même meilleur, sans que je comprenne mon erreur
    J'apprends la programmation pour le plaisir

  5. #25
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    La boucle "do ... loop ..." exécute ce qu'elle contient et ne laisse pas la main à l'appli. (c'est pour cela que dans mon post5 j'ai rajouté une instruction à titre didactique qui donne la main à l'appli; mais qu'il ne faut pas utiliser parceque l'on peut programmer plus proprement avec un timer, et c'est du vb6 à proscrire)

    Quand la boucle "do ... loop ..." est lancée, seul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Timer1.Enabled = True
    s'éxécute.
    En fait il peut y avoir des comportements différents (notemment en debug), mais cela peut/va poser des problèmes avec l'exécutable.

    Ce qui se passe
    Do' exécute d'abord
    Me.Timer1.Enabled = True 'donc Me.Left = Me.Left + 5 (vaut 5) à chaque tour de boucle la propriété est mise à vrai, pas d'incrémentation
    'puis je vérifie si ( 5 ) 0<200, c'est True, donc je recommence la boucle
    'Quand Me.left arrive à 200, je sors de la boucle, Me.Timer1.Enabled devient false, l'incrémentation de s'arrête comme il n'y a pas eu d'incrémentation, la boucle continu tout le temps (et rien ne stipule l'arrêt du timer ni dans la boucle, ni hors de la boucle)
    Loop While Me.Left < 200 'boucle indéfiniment
    La boucle s'exécute sans fin.
    Note : dans ton code rien ne stipule l'arrêt du timer, ni dans la boucle, ni hors de la boucle.

    Ou tu utilises le timer (qui va laisser du temps au système), ou tu utilises une boucle qui est bloquante pour l'appli pendant son exécution et tu fais les additions (Me.Left = Me.Left + 5 avec une temporisation) à l'intèrieur de celle-ci.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #26
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    re:
    Je suis tout à fait d'accord avec rv26 et vu que fais des efforts pour comprendre je te mets deux façons différentes avec un timer.
    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
     
    Public Class Form1
     
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Enabled = False
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 1
            Timer1.Enabled = True
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Me.Left < ((Screen.PrimaryScreen.Bounds.Width - Me.Width) - 10) Then
                Me.Left += 20
            Else
                Timer1.Enabled = False
            End If
        End Sub
    End Class
     
    'Ou encore :
     
    Public Class Form1
     
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Enabled = False
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 1
            Timer1.Enabled = True
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Me.Left < (Screen.PrimaryScreen.Bounds.Width - Me.Width) Then
                Dim P As Point = New Point(Me.Location.X + 20, Me.Location.Y)
                Me.Location = P
            Else
                Timer1.Enabled = False
            End If
        End Sub
    End Class
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  7. #27
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    ACIVE_CS , merci pour votre aide, mais ce code je l'ai déjà fait sans problème. Mais j'explore toutes les pistes pour apprendre.
    rv26t a bien compris mon soucis,ce qui m'a permis de trouver ce qui m’échappait. Donc:
    dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Do
                Me.Timer1.Enabled = True 
            Loop While Me.Left < 200
    l'instruction ne va pas au-delà de Me.Timer1.Enabled = True, et ne cède pas la main à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Me.Left += 5 ' cette instruction est exéutée tant que Me.Timer1.Enabled = True
        End Sub
    du coup, l'incrémentation ne s'exécute pas de tout, Me.Left indéfiniment =valeur initiale.

    Merci à vous tous
    J'apprends la programmation pour le plaisir

  8. #28
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour
    Bien comprendre quand le timer est exécuté

    ex
    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
    private Sub sub1 ()
       timer1.start 
    'timer1tick est exécuté seulement après sub3,et même si le temps d'éxecution de la boucle  et sub3 est supérieur à timer1.interval 
       For i = 0 to 1000000
           sub2(i) 
        Next
       sub3
     End sub
     
    private Sub sub3() 
     blabla
    End sub
     Private Sub sub2(i As Integer)
        Dim TOTO As Boolean
         Do
              blabla()
          Loop Until TOTO
        End Sub
     
     Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick44
        blabla
    End sub

  9. #29
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour stracoma,
    Je crois que rv26 a déjà tenté de t'expliquer plus haut,
    Le "Timer1.Enabled = true" tu dois le faire QU'UNE SEULE FOIS, jamais dans une boucle quelconque
    Ton do/loop ne sert à strictement rien, sauf à te bloquer tout

    Je pense que tu n'as pas bien compris le fonctionnement du timer
    Par défaut il est désactivé quand tu le glisses dans ta form (enabled = false donc)

    Quand tu décideras de le faire tourner tu tapes une fois "Timer1.Enabled = true" et la il va exécuter le code que tu as mis dans "Timer1_Tick" toutes les x millisecondes (x étant le chiffre préalablement réglé dans le "Timer1.interval")
    La il va tourner toujours jusqu'à que tu lui dises "timer1.enabled = false" par exemple
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. timer et boucle
    Par ferarkan dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/01/2010, 15h26
  2. choix entre timer et boucle tantque
    Par phil_niv dans le forum Général Python
    Réponses: 1
    Dernier message: 10/10/2008, 13h16
  3. [AJAX] AJAX, timer et boucle while
    Par podidoo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/03/2007, 20h36
  4. Réponses: 4
    Dernier message: 08/02/2006, 08h31
  5. [VB6] Problème contrôle Timer et boucle For-Next ...
    Par Stéphane BEHMENBURG dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/12/2005, 17h36

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