OVH Cloud OVH Cloud

différents thread travaillant sur une form

2 réponses
Avatar
herbert
bonjour,

Je voudrais qu'un thread en attente de lecture de socket, renseigne une
form avec les données reçues.

Mais j'ai cette erreur:
----------------------------------------------------------------------------
Une exception non gérée du type 'System.ArgumentException' s'est
produite dans system.windows.forms.dll

Informations supplémentaires : Les contrôles créés sur un thread ne
peuvent pas être parents d'un contrôle d'un autre thread.
----------------------------------------------------------------------------

J'ai fait une classe 'client' qui créé son thread, et qui appelle une
callback de la classe 'form' qui l'a créé.

Y-a-t-il un moyen de faire ceci (par message ?), ou faut-il repenser tout ?

merci

2 réponses

Avatar
Jean-Marc Hilaire\(MS\)
Par défaut les controls ne sont pas thread safe, ils ne peuvent être
manipulés par un thread autre que celui qui les a créés. Donc pour faire ce
que vous voulez faire il faut marshaler les appels sur le thread qui a créé
les controls, pour cela vous avez le choix d'utiliser des méthodes comme
invoke, begininvoke, end invoke, etc

Par exemple vous créez dans votre form une méthode qui met à jour vos
controles qu'on appelera UpdateControl par exemple

private void UpdateControl () {

//mise à jour des valeurs
MonControl.Propriete = valeur;
etc.


}



dans la méthode associée au thread vous aurez ce genre de code :

public void ThreadProc() {

try {
MethodInvoker mi = new MethodInvoker(this.UpdateControl );

//Appel de BeginInvoke sur la Form
this.BeginInvoke(mi);

etc




"herbert" wrote in message
news:
bonjour,

Je voudrais qu'un thread en attente de lecture de socket, renseigne une
form avec les données reçues.

Mais j'ai cette erreur:
----------------------------------------------------------------------------
Une exception non gérée du type 'System.ArgumentException' s'est produite
dans system.windows.forms.dll

Informations supplémentaires : Les contrôles créés sur un thread ne
peuvent pas être parents d'un contrôle d'un autre thread.
----------------------------------------------------------------------------

J'ai fait une classe 'client' qui créé son thread, et qui appelle une
callback de la classe 'form' qui l'a créé.

Y-a-t-il un moyen de faire ceci (par message ?), ou faut-il repenser tout
?

merci


Avatar
herbert
Jean-Marc Hilaire(MS) wrote:
Par défaut les controls ne sont pas thread safe, ils ne peuvent être
manipulés par un thread autre que celui qui les a créés. Donc pour faire ce
que vous voulez faire il faut marshaler les appels sur le thread qui a créé
les controls, pour cela vous avez le choix d'utiliser des méthodes comme
invoke, begininvoke, end invoke, etc

Par exemple vous créez dans votre form une méthode qui met à jour vos
controles qu'on appelera UpdateControl par exemple

private void UpdateControl () {

//mise à jour des valeurs
MonControl.Propriete = valeur;
etc.


}



dans la méthode associée au thread vous aurez ce genre de code :

public void ThreadProc() {

try {
MethodInvoker mi = new MethodInvoker(this.UpdateControl );

//Appel de BeginInvoke sur la Form
this.BeginInvoke(mi);

etc




merci !


et j'aurais voulu savoir autre chose:

comment placer les items d'un ListView avec des coordonnées ?

(en MFC il y avait CListCtrl.SetItemPosition(...))

merci