leproc
Messages postés81Date d'inscriptionlundi 26 septembre 2005StatutMembreDernière intervention22 octobre 2008
-
16 avril 2006 à 19:12
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 2016
-
25 mai 2006 à 21:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 25 mai 2006 à 21:19
C'est très clair, LEPROV, merci.
J'étais passé à autre chose mais cette présentation 'threadSafe' me convient tout à fait.
Tu codes dans ta tête, sans compilateur et sans F1 !!!
C'est impressionnant.
Bonne continuation...
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 23 mai 2006 à 22:22
tiens des réponses avec des pseudos tres proches.... ;)
donc pour ton probleme de modification de ton controle via un thread secondaire, petite explication :
un thread ne peux modifier une form ou un de ses composants que si cest ce thread qui a lancé la fenetre....un exemple tout simple de comment modifier la fenetre dans un thread secondaire (en ne mettant qu'une partie du code). imaginons une form qui contienne une textbox (et cest tout)
class MaForm : Windows.Form
{
//création d'un délégué de la fonction prévu pour le callback
private delegate void FonctionModifInterfaceCallBack();
public MaForm()
{
Thread MonThread = new Thread(FonctionModifInterface);
MonThread.Start();
}
//méthode threadsafe
void FonctionModifInterface()
{
//vérification du thread. si on est pas ds le thread qui a lancé la fenetre, cela renvoi true
if (this.textbox1.InvokeRequired())
{
//création d'une instance du délégué de callback
FonctionModifInterfaceCallback d =
new FonctionModifInterfaceCallback(FonctionModifInterface);
//appel du callback. la fonction s'appelle elle meme dans le thread principal et passe alors
//dans le else
this.Invoke(d);
}
else
{
//on est dans le thread principal et la textbox peut etre modifiée
this.textbox1.text = "coucou";
}
}
}
je suis pas sur a 100% du code. s'il y a erreur j'edite ca demain ;)
petite précision : si la fonction possède des parametres, il faut changer une partie du code. par exemple, si la fonction avait été
void FonctionModifInterface(int a, string b)
il faut modifier le code pour avoir ceci :
FonctionModifInterfaceCallback d =
new FonctionModifInterfaceCallback(FonctionModifInterface);
object[] Params = new object[2];
object[1] = a;
object[2] = b;
this.Invoke(d, Params);
ce qui se passe :
on vérifie que le control a été créé dans le thread courant (invokerequired)
si cest le cas, on prépare a lancer la fonction dans le thread qui l'a créé (avec la méthode callback)
on lance cette méthode dans le thread qui a créé le control (control.invoke, ou un de ses parents)
si on est bien dans le bon thread, on modifie le controle
j'ai pas de compilo sous la main et jai plus le code exact en tete, mais a priori si tu crée une appli avec une form nommée MaForm contenant une textbox nommée textbox1, ca devrais compiler et fonctionner (je pense, je vérifierais ca demain et corrigerais si besoin est).
en bref, toute méthode qui risque d'etre appelée dans ton thread secondaire doit etre rendu thread safe d'une manière équivalente.
en éspérant que ca t'aide (et que je n'ai pas posté ca trop tard ^^)
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 21 avril 2006 à 19:38
Heuu, ça m'aide pas vraiment LEPROC !
Mais merci quant même.
leproc
Messages postés81Date d'inscriptionlundi 26 septembre 2005StatutMembreDernière intervention22 octobre 2008 16 avril 2006 à 19:12
Bravo pour la coloration syntaxique un vrai casse tête
25 mai 2006 à 21:19
J'étais passé à autre chose mais cette présentation 'threadSafe' me convient tout à fait.
Tu codes dans ta tête, sans compilateur et sans F1 !!!
C'est impressionnant.
Bonne continuation...
23 mai 2006 à 22:22
donc pour ton probleme de modification de ton controle via un thread secondaire, petite explication :
un thread ne peux modifier une form ou un de ses composants que si cest ce thread qui a lancé la fenetre....un exemple tout simple de comment modifier la fenetre dans un thread secondaire (en ne mettant qu'une partie du code). imaginons une form qui contienne une textbox (et cest tout)
class MaForm : Windows.Form
{
//création d'un délégué de la fonction prévu pour le callback
private delegate void FonctionModifInterfaceCallBack();
public MaForm()
{
Thread MonThread = new Thread(FonctionModifInterface);
MonThread.Start();
}
//méthode threadsafe
void FonctionModifInterface()
{
//vérification du thread. si on est pas ds le thread qui a lancé la fenetre, cela renvoi true
if (this.textbox1.InvokeRequired())
{
//création d'une instance du délégué de callback
FonctionModifInterfaceCallback d =
new FonctionModifInterfaceCallback(FonctionModifInterface);
//appel du callback. la fonction s'appelle elle meme dans le thread principal et passe alors
//dans le else
this.Invoke(d);
}
else
{
//on est dans le thread principal et la textbox peut etre modifiée
this.textbox1.text = "coucou";
}
}
}
je suis pas sur a 100% du code. s'il y a erreur j'edite ca demain ;)
petite précision : si la fonction possède des parametres, il faut changer une partie du code. par exemple, si la fonction avait été
void FonctionModifInterface(int a, string b)
il faut modifier le code pour avoir ceci :
FonctionModifInterfaceCallback d =
new FonctionModifInterfaceCallback(FonctionModifInterface);
object[] Params = new object[2];
object[1] = a;
object[2] = b;
this.Invoke(d, Params);
ce qui se passe :
on vérifie que le control a été créé dans le thread courant (invokerequired)
si cest le cas, on prépare a lancer la fonction dans le thread qui l'a créé (avec la méthode callback)
on lance cette méthode dans le thread qui a créé le control (control.invoke, ou un de ses parents)
si on est bien dans le bon thread, on modifie le controle
j'ai pas de compilo sous la main et jai plus le code exact en tete, mais a priori si tu crée une appli avec une form nommée MaForm contenant une textbox nommée textbox1, ca devrais compiler et fonctionner (je pense, je vérifierais ca demain et corrigerais si besoin est).
en bref, toute méthode qui risque d'etre appelée dans ton thread secondaire doit etre rendu thread safe d'une manière équivalente.
en éspérant que ca t'aide (et que je n'ai pas posté ca trop tard ^^)
21 avril 2006 à 19:38
Mais merci quant même.
16 avril 2006 à 19:12