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 :
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
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
qui me dit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MainForm.Invoke(New ChangeTextDelegate(AddressOf ChangeText), "Itération " & i)
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 ?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).
Merci !
Partager