Opérations cross-threads déclenché par un évènement [Résolu]

Signaler
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008
-
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008
-
Bonjour,

J'aimerais me servir des conseils de MorpionMx au sujet des Opérations cross-threads (http://www.csharpfr.com/tutoriaux/CSHARP-OPERATIONS-CROSS-THREADS-UTILISATION-DELEGATIONS-SYNCHRONES-ASYNCHRONES_174.aspx) pour adapter la source Client-Serveur de LumesH (http://www.csharpfr.com/codes/CLASS-TCP-CLIENT-SERVEUR_32989.aspx).

Ca fait plusieurs heures que je bataille, pourtant j'ai très bien compris le principe des délégués pour éviter les cross-threads . Là où je bloque c'est que, pour créer un évènement dans sa classe "serveur", LumesH utilise déjà des délégués. Pourtant, lorsqu'un évènement se produit et qu'un Label du WinForm est modifié pendant cet évènement je récupère un cross-threads. Comment faire pour que la méthode lancée par le thread appelle un délégué du WinForm (qui va appelé la méthode de modification du Label) plutôt qu'un délégué lié à l'évènement, tout en conservant la notion d'évènement?

J'avoue que je m'embrouille un peu tout seul là, ça fait des heures que je tourne en rond, c'est très confu tout ça pour moi... J'ai réussi à reproduire l'exemple de MX sans traiter d'évènement mais là, je bloque complètement!

Quelqu'un a peut-être déjà modifié le source Client-Serveur de LumesH pour qu'il ne génère plus de cross-threads...?

7 réponses

Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Peut-être tu devrais allez voir ca : THREADER SIMPLEMENT UNE CLASSE POUR INTERAGIR AVE ...

<hr />
I love .net
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Ben tu fais comme ca :

classmaClass{
privateMaClassThreadee maVariableLocalDeMaclassTreadee;

public maClass()
{
   maVariableLocalDeMaclassTreadee = newMaClassThreadee(this);
}

}

<hr />
I love .net
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

Je vais essayer de me débrouiller avec ça, merci!
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

J'y suis presque, sauf que je n'arrive pas à déclarer la classe à Threader en utilisant le mot clé "this" :

// créer une nouvelle instance du serveur

private
tcpServeur InstanceClasseServeur =
new
tcpServeur(
this);

Je ne peux pas utiliser cette syntaxe si je ne suis pas à l'intérieur d'une méthode, le compilateur me signale que "this" est hors contexte. Si je créé l'instance depuis une méthode ça fonctionne mais je ne peux accéder ensuite à cette instance que depuis cette même méthode.

Comment puis-je passer en paramètre mon objet Form sans utiliser "this"?
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Si tu respectes le schema de mon exemple, tu ne devrais pas avoir de pb

<hr />
I love .net
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

Oui en respectant le schéma de l'exemple effectivement aucun problème, mais dans ton exemple tu déclares l'instance de la classe à Threader dans une méthode de la Form appelante. Ce que je souhaite c'est pouvoir accéder à mon instance depuis n'importe quelle méthode de ma Form, donc j'suis obligé de la déclarer en dehors d'une méthode, et là, "this" ne passe pas...

Cela dit, ton exemple m'a quand même beaucoup aidé.
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

Ben ouais, ça marche nickel, c'était pas compliqué et pourtant j'y ai passé un sacré bout de temps sans trouver. Ca paraît tellement évident quand on a la réponse, j'ai vraiment du mal, vivement que tout cela soit limpide pour que j'évite de poser des questions cons.

Merci encore!