Opération inter thread [Résolu]

Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Dernière intervention
12 avril 2017
- - Dernière réponse : Whismeril
Messages postés
12362
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
- 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!!!!!!!!!
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Dernière intervention
12 avril 2017
3
Merci
sujet reformulé en plus clair ici:

A+

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

Merci cs_thebigboss 3

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_thebigboss
Messages postés
94
Date d'inscription
lundi 7 juillet 2008
Dernière intervention
7 mars 2009
0
Merci
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 ! 
Commenter la réponse de gglamicose
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Dernière intervention
12 avril 2017
0
Merci
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!!!!!!!!!
Commenter la réponse de cs_thebigboss
Messages postés
94
Date d'inscription
lundi 7 juillet 2008
Dernière intervention
7 mars 2009
0
Merci
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
Commenter la réponse de gglamicose
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Dernière intervention
12 avril 2017
0
Merci
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!!!!!!!!!
Commenter la réponse de cs_thebigboss
Messages postés
357
Date d'inscription
jeudi 8 juin 2006
Dernière intervention
26 décembre 2011
0
Merci
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+
Commenter la réponse de xmox667
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
Whismeril
Messages postés
12362
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
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
Commenter la réponse de MorpionMx
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Dernière intervention
12 avril 2017
0
Merci
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!!!!!!!!!
Commenter la réponse de cs_thebigboss

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.