bubbathemaster
Messages postés339Date d'inscriptiondimanche 26 janvier 2003StatutMembreDernière intervention25 mars 2009
-
11 août 2007 à 16:58
bubbathemaster
Messages postés339Date d'inscriptiondimanche 26 janvier 2003StatutMembreDernière intervention25 mars 2009
-
11 août 2007 à 20:42
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.)
Nikoui
Messages postés794Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention19 août 200813 11 août 2007 à 17:57
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;
}
}
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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
bubbathemaster
Messages postés339Date d'inscriptiondimanche 26 janvier 2003StatutMembreDernière intervention25 mars 20094 11 août 2007 à 20:39
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.