Opération inter thread [Résolu]

cs_thebigboss 216 Messages postés jeudi 30 janvier 2003Date d'inscription 12 avril 2017 Dernière intervention - 29 sept. 2008 à 10:03 - Dernière réponse : cs_thebigboss 216 Messages postés jeudi 30 janvier 2003Date d'inscription 12 avril 2017 Dernière intervention
- 30 sept. 2008 à 14:16
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 

8 réponses

Répondre au sujet
cs_thebigboss 216 Messages postés jeudi 30 janvier 2003Date d'inscription 12 avril 2017 Dernière intervention - 30 sept. 2008 à 14:16
+3
Utile
sujet reformulé en plus clair ici:

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_thebigboss
gglamicose 94 Messages postés lundi 7 juillet 2008Date d'inscription 7 mars 2009 Dernière intervention - 29 sept. 2008 à 11:24
0
Utile
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
cs_thebigboss 216 Messages postés jeudi 30 janvier 2003Date d'inscription 12 avril 2017 Dernière intervention - 29 sept. 2008 à 11:32
0
Utile
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
gglamicose 94 Messages postés lundi 7 juillet 2008Date d'inscription 7 mars 2009 Dernière intervention - 29 sept. 2008 à 11:45
0
Utile
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
cs_thebigboss 216 Messages postés jeudi 30 janvier 2003Date d'inscription 12 avril 2017 Dernière intervention - 29 sept. 2008 à 12:27
0
Utile
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
xmox667 357 Messages postés jeudi 8 juin 2006Date d'inscription 26 décembre 2011 Dernière intervention - 29 sept. 2008 à 12:36
0
Utile
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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 29 sept. 2008 à 12:48
Commenter la réponse de MorpionMx
cs_thebigboss 216 Messages postés jeudi 30 janvier 2003Date d'inscription 12 avril 2017 Dernière intervention - 29 sept. 2008 à 13:01
0
Utile
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.