
Envoyé par
Pol63
si tu veux dire par là que le label est sur un autre thread, certes, mais ca ne limite en rien
une variable n'est pas visible que depuis un thread mais depuis tous, c'est juste une question de portée après
ce qui est autre chose que le fait qu'un controle ne soit pas modifiable depuis un autre thread ; il reste accessible
si tu veux dire par là que depuis la sub qui est threadée tu n'as pas accès la lblMonLabel alors le code que nous as donné en exemple n'as aucune raison de fonctionner non plus ...
si le code de ton thread est au même endroit que le code behind du form, il n'y a pas de soucis
si le code ton thread est dans une autre classe il faut que cette classe connaisse le form ou le label (donc lui passer une référence, par exemple à la création)
Merci déjà de t’intéresser a mon petit souci.
Explication :
En fait j'essaie de tout séparer, dans la form il n'y a que ce qu'il y a dans la form, donc gestion des évènement du à l'interface IHM, éventuellement des timers.
Ensuite j'ai des classes ou l'algo de fonctionnement se retrouve.
L'une d'entre elle me sert de communication avec le port COM. La boucle qui tourne pour lire le port COM est lancé par un autre thread.
Donc tout ce qui découle de la lecture de mon Port COM se retrouve dans ce thread.
L’analyse des trames par exemple. Dans l'une des trames se trouve la vitesse de COM final, car je dois la changer pour le client final, suivant sont application.
Lorsque je trouve cette trame je la décortique et j'envoie l'information sur mon formulaire, le label, pour indiquer la vitesse de COM final entre autre car du coup je change aussi ma vitesse de COM.
C'est une explication de l'une de mes applications en cours. Mais j'ai d'autre thread (pour telnet par exemple) etc...
Plusieurs données à transmettre d'un thread à un autre pour l'affichage dans le formulaire.
En ce qui concerne mon code:
1 2 3 4 5 6 7 8 9 10
|
Private Delegate Sub Changetext(ByVal txt As String)
Public Sub ChangeLabel(ByVal txt As String)
If Me.InvokeRequired Then
Me.Invoke(New Changetext(AddressOf ChangeLabel), txt)
Else
lblMonLabel.Text = txt
End If
End Sub |
Sa il se trouve dans le formulaire appelé : formMain
1 2 3 4 5 6 7 8
| j'ai dans module
public frmMain as formMain
sub Main()
frmMain = new formMain
frmMain.showdialogue() 'Je l'écrit de tête
end sub |
Depuis mon thread je fait (en simplifiant):
frmMain.ChangeLabel("Nouveau baudrate = 115200")
et sa cela fonctionne bien.
Lorsque le thread appel la fonction il passe par le:
1 2
| If Me.InvokeRequired Then
Me.Invoke(New Changetext(AddressOf ChangeLabel), txt) |
Puis sort et l'appli lance bien cette même fonction (lorsqu'elle est libre si j'ai bien compris) et modifie mon label.
Partager