Opération inter thread

Résolu
cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 - 29 sept. 2008 à 10:03
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 16 juil. 2018 à 16:26
Bonjour,

je fais un petit soft qui comporte une fenêtre principale et une fenêtre secondaire. La fenêtre secondaire est crée à l'ouverture de la fenetre principale mais n'est pas montrée. Elle tourne en tache de fond et se montre elle même (this.show()) lors d'un événement externe (connexion d'un socket client). Le problème c'est que j'ai une execption du type:
"opération inter-threads non valide : le contrôle " a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

J'ai essayé d'utiliser la methode Invoke mais j'ai une autre exception me disant que tant que le Handle n'a pas été généré je ne peux pas utiliser cette methode.

Quelqu'un aurait une idée?

Merci d'avance.

Nico

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!

8 réponses

cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 2
30 sept. 2008 à 14:16
sujet reformulé en plus clair ici:

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
29 sept. 2008 à 12:48
1
Lien mort
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
16 juil. 2018 à 16:26
BONJOUR si si un peu de politesse ça ne fait pas de mal

Le site a changé d’hébergement depuis, les redirections ne marchent pas toutes.
Quelques secondes de recherches dans les tutos de MorpionMx et voilà
https://codes-sources.commentcamarche.net/faq/174-c-operations-cross-threads-utilisation-des-delegations-synchrones-asynchrones
0
gglamicose Messages postés 94 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 7 mars 2009 1
29 sept. 2008 à 11:24
Salut thebigboss !
Ton problème est que tes 2 fenêtres partagent le même Thread, et qu'elles essaient toutes les 2 d'effectuer des opérations au même moment (ben ouais ça fait pleins de p'tits truc des fenêtres ). Confronté à un problème similaire, j'ai opté pour l'utilisation d'un BackgroundWorker: ainsi ma 2éme fenêtre (qui s'occupait d'une tache lourde, en l'occurence l'affichage) avait son propre Thread de travail. Donc plus de conflit mémoire entre mes 2 fenêtres.
Ceci dit, l'utilisation d'un BackgroundWorker est plutot conseillé pour des tâches lourdes, dans ton cas ça me parait peut être un peu "costaud" pour une utilisation occasionelle... Après ça reste tout de même plus simple qu'une gestion des Thread, à toi de voir ! 
0
cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 2
29 sept. 2008 à 11:32
Merci de ta réponse rapide mais le thread en question ne tourne que sur ma seconde fenetre (celle non affichée). Lorsque ce fameux thread a reçu  la condition necessaire il affiche la fenetre: this.show();

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gglamicose Messages postés 94 Date d'inscription lundi 7 juillet 2008 Statut Membre Dernière intervention 7 mars 2009 1
29 sept. 2008 à 11:45
Je vois, tu as donc déja séparé tes 2 fenêtres dans 2 Thread différents... Le probléme d' "opération inter-threads" c'est que ton premier Thread (disons celui la fenetre 1 ) veut tenter d'afficher la fenetre 2 qui est sur un autre Thread... Mais là, j'avoue que sans la méthode Invoke sa va être chaud...
Je vais essayer de regarder dans mes anciens projets voir si je retrouve celui ou j'utilisais les BgWorker, et si j'ai du nouveau je te le posterai
0
cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 2
29 sept. 2008 à 12:27
Non en fait le comportement de mon projet est le suivant:

Ma fenetre principale s'affiche, elle ne contient pas de thread. Elle crée un objet Form2 qui contient un thread qui ecoute le reseau (TCPListener). Lorsque ce thread recoit un appel, il affiche la fenetre 2.=> this.Show();

Donc je ne comprends pas pourquoi il me parle d'inter-Thread...

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!
0
xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 4
29 sept. 2008 à 12:36
Salut,
Normalement la méthode Invoke de la Form 2 te permet cette opération.
En attendant tu peux utiliser la propriété CheckForIllegalCrossThreadCalls ( mettre à false dans le constructeur de la Form 2) pour ne plus avoir l'exception.
Poste une partie (appel au invoke) de ton code qu'on y jette un œil.
A+
0
cs_thebigboss Messages postés 216 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 12 avril 2017 2
29 sept. 2008 à 13:01
Merci je l'ai déjà lu.

En fait j'ai avancé un peu plus. J'ai compris où se trouvais l'inter-thread. C'est dans ma Form2 que j'ai 2 threads.

Le premier attend une connexion d'un client. Une fois fait il crée un second thread qui ecoute et affiche les messages reçus. J'avais le problème en mettant le this.Show() dans le premier thread. Du coup je le mets dans le soncd thread et ma fenêtre s'affiche sans ucune exception... mais sans aucun controls
Ma form est vide et n'affiche que le fond de mon ecran..
 

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!
0
Rejoignez-nous