Delegate sur evenement dans classe
Bonjour à tous,
j'ai essayé de faire une classe avec une Sub principale qui boucle sur elle même,
et 2 Sub (Demarrer, Arreter) qui permettent de la démarrer ou de l'arrêter.
Je démarre la Sub que j'ai nommé "Boucle" dans un nouveau Thread.
Dans cette boucle, au démarrage et à l'arrêt, je déclenche un évènement.
Ensuite dans une Form1 j'ai 2 boutons, un pour lancer la boucle et l'autre pour l'arrêter.
Avec aussi une TextBox1 qui sert à afficher la String retourné par l'évènement de la classe.
Suivant que la boucle à démarrée ou qu'elle s'est arrêtée.
Tout avait l'air de fonctionner correctement, mais lorsque l'évènement se déclenche un message d'erreur s'affiche :
"Opération inter-threads non valide"
J'ai cru comprendre après 3 jours de lecture...qu'il fallait utiliser ce qu'on appelle un Delegate
en parallèle de la méthode Invoke.
Ma classe s'appelle "clsBoucle".
L'instance de ma classe dans Form1 s'appelle "toto". Je la repere plus facilement dans le code...
J'ai donc ajouté au debut de Form1 :
Code:
1 2 3
| Private Delegate Sub toto_Evenement_Callback(ByVal Txt As String)
Public WithEvents toto As New clsBoucle |
puis dans la Sub qui gère l'evenement :
Code:
1 2 3 4 5 6
| If Me.TextBox1.InvokeRequired = True Then
Dim t As New toto_Evenement_Callback(AddressOf toto_Evenement)
Me.Invoke(t, New Object() {Txt})
Else
Me.TextBox1.Text = Txt
End If |
La classe "clsBoucle" :
Code:
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
| Public Class clsBoucle
Private objThread As System.Threading.Thread
Private m_Started As Boolean = False
Public Event Evenement(ByVal Txt As String)
Public Property Started() As Boolean
Get
Return m_Started
End Get
Set(ByVal value As Boolean)
m_Started = value
End Set
End Property
Private Sub Boucle()
RaiseEvent Evenement("Démarré")
While m_Started = True
Application.DoEvents()
End While
RaiseEvent Evenement("Arreté")
End Sub
Public Sub Demarrer()
Me.Started = True
objThread = New System.Threading.Thread(AddressOf Me.Boucle)
objThread.Start()
End Sub
Public Sub Arreter()
Me.Started = False
End Sub
End Class |
Ma question est de savoir s'il y aurait moyen de faire plus simple et d'éviter ce Delegate dans Form1.
En fait d'avoir le moins de code pour gérer l'évènement dans Form1.
Merci d'avance