Threads et accès à l'application [Résolu]

Signaler
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Bonjour,

Je programme depuis qq temps un client FTP. Jusque là tout allait bien jusqu'à ce que je décide d'utiliser des threads. En effet, lorsque j'envoi une commande et attend la réponse du serveur, le programme est bloqué, ce qui est quand même plutôt génant.

L'idée est donc de lancer les commandes dans un thread à part.

J'ai donc par exemple, une fonction qui créé un thread qui a pour objectif de se connecter à un serveur. Le truc c'est que je veux que ce thread update l'affichage des réponses serveurs dans une textbox comme dans n'importe quel programme FTP, mais là; c'est le drame. Plantage: le thread ne peut pas accéder à la boite de texte car elle n'a pas été crée par ce thread.(message Visual Studio: Cross-thread operation not valid: Control 'rtfRaw' accessed from a thread other than the thread it was created on.)

Comment faire?

6 réponses

Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Si tu regardes sur le message d'exception que te renvoie Visual Studio, il y a un lien du genre "Comment faire des appels cross thread" qui t'explique comment résoudre ce problème.

En version simplifiée ca donne ça (de mémoire, possible qu'il y ai des fautes de frappes) :

// Délégué qui correspond à la methode que tu veux appeler
private delegate void MaMethodeDelegate(string updatedText);

// La méthode que tu appelles et qui va mettre a jour le textebox (même signature que le délégué ci dessus)
public void MaMethode(string updatedText)
{
  // On teste pour vérifier si on est sur le bon thread
  if(monTextBox.InvokeRequired)
  {
    // On est pas sur le bon thread, on rapelle la même méthode, mais depuis le thread "courant" du textbox
    // On pointe sur cette méthode
   MaMethodeDelegate d = new MaMethodeDelegate(MaMethode);
    // C'est le textBox lui même qui appelle la méthode, depuis son propre thread
    monTextBox.Invoke(d, updatedText);
  }
  else
  {
    // On est sur le bon thread, on peux continuer sans lever d'erreur
    monTextBox.Text = updatedText;
  }
}

<hr size="2" width="100%" />Working as designed
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Hum merci beaucoup j'vais considérer que c'est bon et j'vais tester ça après manger :)

Sinon j'ai vu une méthode de bourrin: désactiver les checks des opérations interthreads illégales... Y'a toujours ça au cas où.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
Salut,


Désactiver le check ça veut dire cacher le fait qu'il y a un problème, toujours sympa pour celui qui devra effectuer la maintenance. :p

Sinon il y a aussi le tuto de Mx : [http://www.csharpfr.com/tutorial.aspx?ID=174 [C#] OPÉRATIONS CROSS THREADS - UTILISATION DES DELEGATIONS SYNCHRONES / ASYNCHRONES]

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Et après test, je confirme ta solution une bonne fois pour toute.

Au passage merci à coq pour le tuto et j'mets la ligne de code de bourrin en question:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

Franchement j'ai regardé vite fait des tutos sur comment faire (après avoir googlé le message d'erreur de VS) et ca me semblait vraiment hyper compliqué. Ta solution marche vraiment bien Nikoui et sans rajouter des tonnes de lignes de code. Encore une fois merci!
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Aie, jviens de me rendre compte que ca m'a créé un autre problème:

Par exemple, si jme connecte/deco ca maffiche:

Connecting to ftpperso.free.fr on port 21...
USER toto
PASS ********
220 Serveur de mise a jour des pages perso de Free.fr version [Feb 11 2007 20:22:14]
331 Password required for toto.
QUIT
230 User toto logged in.
221 Goodbye.

Alors que ca devrait faire:
Connecting to ftpperso.free.fr on port 21...

220 Serveur de mise a jour des pages perso de Free.fr version [Feb 11 2007 20:22:14]
USER toto

331 Password required for toto.

PASS ********

230 User toto logged in.

QUIT

221 Goodbye.

Et là je ne comprends pas d'où ca vient. A l'interieur du thread de connection, le code est sensé attendre et afficher la réponse du serveur avant de passer à l'étape suivante. Ca a beau être dans un nouveau thread, le code est quand même sensé s'éxecuter ligne par ligne et je vois pas comment ca peut me sortir ça.
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
MESSAGE PRECEDENT A OUBLIER...

J'ai pas trouvé comment l'éditer... Ca venait d'un vieux code. Désolé pour le dérangement ...