Bonjour à tous,

J'ai créé un programme dans lequel je souhaiterais lancer les calculs de plusieurs modèles simultanément sur plusieurs threads. Pour cela j'utilise un MainForm qui gère l'affichage utilisateur et une classe Modèle à partir de laquelle sont instanciés mes modèles. J'aimerais que chaque modèle puisse effectuer ses calculs sur son propre thread, et pouvoir en même temps récupérer les informations de ces calculs sur ma MainForm.

Pour l'instant, mon code est le suivant :

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
44
45
46
47
Imports System.Threading
 
'Interface utilisateur
Public Class MainForm
    Inherits Form
 
    Public Label1 As Windows.Forms.Label
    Public Label2 As Windows.Forms.Label
 
    Private Sub MainForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 
        Dim monModele1 As New Modele(Label1)
        Dim monModele2 As New Modele(Label2)
        '...
 
    End Sub
 
End Class
 
'Modèle de calcul
Public Class Modele
 
    Delegate Sub ChangeTextDelegate(ByVal text As String)
    Private m_Thread As Thread
    Private m_Label As Windows.Forms.Label
 
    Public Sub New(ByVal Label As Windows.Forms.Label)
        m_Label = Label
        m_Thread = New Thread(AddressOf Calcul)
        m_Thread.Start()
    End Sub
 
    Public Sub Calcul()
        'mes gros calculs
        Dim i As Integer = 0
        Do
            i += 1
            MainForm.Invoke(New ChangeTextDelegate(AddressOf ChangeText), "Itération " & i)
            Thread.Sleep(100)
        Loop While i < 100000
    End Sub
 
    Public Sub ChangeText(ByVal text As String)
        m_Label.Text = text
    End Sub
 
End Class
Seulement quand j'exécute ce code, j'ai une erreur au niveau de la ligne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
MainForm.Invoke(New ChangeTextDelegate(AddressOf ChangeText), "Itération " & i)
qui me dit :

Une erreur s'est produite lors de la création du formulaire.
Pour plus d'informations, consultez Exception.InnerException.
L'erreur est : Impossible d'instancier le contrôle ActiveX '8856f961-340a-11d0-a96b-00c04fd705a2',
car le thread actuel n'est pas un thread cloisonné (STA, Single-Threaded Apartment).
Y-a-t-il une solution pour résoudre ce problème ou est-il impossible d'effectuer des opérations inter-threads entre deux classes ?

Merci !