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 : 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
puis dans la Sub qui gère l'evenement :

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
La classe "clsBoucle" :

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
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