Partage
  • Partager sur Facebook
  • Partager sur Twitter

[vb .NET] Problème avec les évenements

    20 avril 2011 à 9:15:46

    Bonjour,

    J'aurais besoin d'exécuter un évènement toutes les 2 secondes afin de faire une MAJ comme dans le tuto à la page suivante:
    http://www.siteduzero.com/tutoriel-3-3 [...] tml#ss_part_3


    Donc je tappe dans une classe séparée de celle de mon programme:
    Public Class Rafraichissement
        Private WithEvents _Tim As Timer
        Private _Compteur As Integer
    
        Sub New()
            _Tim = New Timer
            _Tim.Interval = 1000
            _Tim.Start()
            _Compteur = 0
        End Sub
    
    
        Public Event Refresh()
        Sub _Tim_Tick() Handles _Tim.Tick
            _Compteur += 1
            If _Compteur = 2 Then
                RaiseEvent Refresh()
            End If
        End Sub
    End Class
    



    Puis je déclare mon évenement dans la classe du programme:
    Dim WithEvents maj As Rafraichissement
    



    Puis, dans Form_load, je crée l'évenement:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                   maj = New Rafraichissement()
    
        End Sub
    




    Et enfin lors de l'évènement, j'effectue mon code et à la fin je crée un nouvel évènement afin que l'action se répète:
    Sub Rafraichissement() Handles maj.Refresh
    'Code à exécuter lors de ma MAJ
    maj = New Rafraichissement()
        End Sub
    


    Avec tout ceci, mes mise à jour fonctionnent pendant toute une journée sans problème et tout à coup, j'obtiens une erreur: "win32Exeption n'a pas été gérée". Voir l'image suivante:

    Image utilisateur

    Je n'ai pas trouver d'aide sur le net. Peut-être que quelqu'un pourra m'aider!
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2011 à 11:27:34

      Le problème vient du fait que tu crées un nouvel objet Rafraichissement à chaque refresh. Tel que tu l'as définie, cette classe ne peut déclencher qu'un seul événement deux secondes après sa création; et je pense que l'erreur vient du fait que tu crées des nouveaux timers en pagaille jusqu'à ce que Windows déclare forfait.

      Note au passage que ta classe Rafraichissement n'a aucun intérêt. Il te suffit de manipuler le timer directement dans ta Form et d'écouter son évènement Tick plutôt que l'événement Refresh de cette classe. Pour obtenir un événement toutes les deux secondes, définis la propriété Interval du timer à 2000ms au lieu de 1000ms. Tu pourras ainsi utiliser le même timer pendant toute la durée de vie de ta form ;)
      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2011 à 11:47:01

        Ton code me semble assez dangereux !!

        Dans ta sub Raffraichissement tu recrée une instance de la classe Rafraichissement sans "arrêter/detruire" l'ancienne.
        Bref ca me parait carrément pas propre ... selon moi les timers continuent à s'exécuter en parallèle, et il en existe de plus en plus à chaque nouvelle instance !

        Voila ce qui me semblerait plus propre (a tester ...) :

        Public Class Rafraichissement
            Private WithEvents _Tim As Timer
            Private _Compteur As Integer
        
            Sub New()
                _Tim = New Timer
                _Tim.Interval = 1000
                _Compteur = 0
                _Tim.Start()
            End Sub
        
        
            Public Event Refresh()
        
            Sub _Tim_Tick() Handles _Tim.Tick
                Try
                    _Compteur += 1
                    If _Compteur = 2 Then
                        _Compteur = 0
                        RaiseEvent Refresh()
                    End If
                Catch (ex as Exception)
                End Try
            End Sub
        
            Sub Stop()
                _Tim.Stop()
                _Tim.Dispose()
            End Sub
        
        End Class
        


        Sub Rafraichissement() Handles maj.Refresh
            'Code à exécuter lors de ma MAJ
        End Sub
        


        Dans oublier d'appeler Stop() quand on quitte la forme ...

        C'est pas parfait mais ca devrait etre deja mieux comme code :)
        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2011 à 12:05:43

          Tu peux carrément supprimer cette classe, elle n'apporte rien de plus qu'un Timer normal.
          • Partager sur Facebook
          • Partager sur Twitter
            20 avril 2011 à 12:13:13

            C'est tout a fait vrai, a moins que tu nous ai montré qu'une (toute) petite partie de ton code, et que cette classe ait un réel intéret (comme précisé : dans le cas actuel, il faut la supprimer)
            • Partager sur Facebook
            • Partager sur Twitter
              20 avril 2011 à 22:11:18

              Je vous rercie pour vos réponses. Ca m'a permis de comprendre le pourquoi de l'erreur.

              Par contre, comment puis-je répéter des actions toutes les 2 secondes indéfiniment sans une classe séparée? Je ne comprend pas de quelle manière je peux le faire!
              • Partager sur Facebook
              • Partager sur Twitter
                20 avril 2011 à 22:59:32

                Bah... un timer à 2 secondes, avec du code dans l'évènement tick? :/
                • Partager sur Facebook
                • Partager sur Twitter
                  21 avril 2011 à 9:24:05

                  Exactement, tu t'embete vraiment pour rien ^^. Tu met les actions,lignes de code que tu veux refaire toute les 2 sec dans ton timer. Et c'est bon. Par exemple dans mon projet je devais récrire mes labels toute les 500ms, ben j'ai mit mes calculs de valeur et ma récriture de label dans le timer.

                  Après tu n'est pas obliger de mettre ton code dedans, tu peux juste l'appeler ça suffit aussi ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 avril 2011 à 10:59:46

                    - Tu ajoutes un composant Timer sur ta forme.
                    - Tu définis l'intervalle à 2000
                    - Tu redéfinis l'évènement Tick() (en double cliquant sur le timer en mode design par exemple) dans lequel tu mets ton code qui s'exécute toutes les 2 secondes
                    - Dans ton code, lorsque tu souhaites démarrer ton timer, tu fais Timer1.Start()
                    Et voila !
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [vb .NET] Problème avec les évenements

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown