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 :
puis dans la Sub qui gère l'evenement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Delegate Sub toto_Evenement_Callback(ByVal Txt As String) Public WithEvents toto As New clsBoucle
La classe "clsBoucle" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Ma question est de savoir s'il y aurait moyen de faire plus simple et d'éviter ce Delegate dans Form1.
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 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
En fait d'avoir le moins de code pour gérer l'évènement dans Form1.
Merci d'avance
Partager