Problème de thread [Résolu]

Signaler
Messages postés
8
Date d'inscription
jeudi 21 octobre 2004
Statut
Membre
Dernière intervention
16 décembre 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
A partir d'un WinForm je lance un thread qui accède a un contôle de la WinForm.
Le souci c'est qu'en je lance l'execution du programme à partir de Visual Studio il génére une exception :
le thread ne peut pas acceder à un contrôle declaré dans un autre thread de la WinForm.
Ca marche lorsque j'execute directement l'exe via l'explorateur.

Si quelqu'un sait comment resoudre ce souci je l'en remercie par avance.

9 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
tu ne dois pas acceder directement a un element de l'interface graphique depuis un autre thread

exemple de code pour recuperer la valeur :
private void pbConnect_Click(object sender, EventArgs e)
        {
            AcceptConnexionDelegate acd = new AcceptConnexionDelegate(AcceptConnexion);
            acd.BeginInvoke(null, null);
        }

        private int GetPortNumberValue()
        {
            return Convert.ToInt32(txtPortNumber.Text);
        }

        private delegate int GetPortNumberValueDelegate();

        private delegate void AcceptConnexionDelegate();
        private void AcceptConnexion()
        {
            Socket CurrentClient = null;
            Socket ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            int port = (int)txtPortNumber.Invoke(new GetPortNumberValueDelegate(GetPortNumberValue));
            ServerSocket.Bind(new IPEndPoint(ipAddress, port));
            ServerSocket.Listen(10);
        }


Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

Bonjour,

si t'as du code à nous montrer on pourrait mieux cibler ton pb

hum.......
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
http://www.csharpfr.com/forum.v2.aspx?ID=328961 parle du même pb je crois

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

oualla_mohamed à ecrit:

Voila une partie du code.
Au départ j'utilisé des threads et en cherchant de la doc sur le net j'ai changé pour les delegates mais j'ai toujours la meme erreur.

Erreur:
Illegal cross-thread operation: Control 'txtPortNumber' accessed from a thread other than the thread it was created on.


private void pbConnect_Click(object sender, EventArgs e)
{
AcceptConnexionDelegate acd = new AcceptConnexionDelegate(AcceptConnexion);
acd.BeginInvoke(null, null);
}

private delegate void AcceptConnexionDelegate();
private void AcceptConnexion()
{
Socket CurrentClient = null;
Socket ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket.Bind(new IPEndPoint(ipAddress, Convert.ToInt32(this.txtPortNumber.Text)));
                ServerSocket.Listen(10);
}



c'est l'acces à this.txtPortNumber.Text qui pose probleme.

A+

note : oualla_mohamed poste ton code sur le forum plutot que par message privé tu auras plus facilement de l'aide vu qu'en l'occurence je ne peux pas t'aider


hum.......
Messages postés
131
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
7 juillet 2005

tu le declares où this.txtPortNumber ?

hum.......
Messages postés
18
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
12 mars 2008

On a cette possibilité qui enlève la sécurité du framework 2.0 :

Control.CheckForIllegalCrossThreadCalls=false

Cordialement

A vous de tester je ne sais plus si c'est du C# ou du VB.NET

Olivier
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Salut,

Ce qui a pour effet de masquer le problème et non le résoudre...
Le mieux est donc naturellement de passer par ce qui est décrit par exemple dans ce tuto : OPÉRATIONS CROSS THREADS - UTILISATION DES DELEGATIONS SYNCHRONES / ASYNCHRONES

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
18
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
12 mars 2008

J'ai bien préciser qui enlève la sécurité, donc le code sera beaucoup moins sur, certe.

Olivier
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
86
Oui , c'était surtout pour être sûr que personne ne prenne ça comme solution viable :-)

/*
coq
MVP Visual C#
CoqBlog
*/