Salut Hurin,
en fait la plupart de mon post ne t'etait pas forcement destiné, mais c'etait une reponse concernant l'instanciation de form sur des threads differents.
Je vais essaiyer de repondre a tes questions :
Pour le thread du pool, en fait, c'est un thread comme un autre mais qui emane d'un pool qui est unique dans ton application et qui est representé par la classe ThreadPool (System.Threading). Cette derniere gere des threads en interne, et te permet de poster simplement des taches dedans (.QueueUserWork(WaitCallback()) )sans te preoccuper de la gestion du thread. Le comportement que je voulais souligner ici est que les pools du threads (tu verras plus tard qu'on en a utilisé un implicitement) n'ont pas forcement les caracteristiques necessaires à gerer un affichage (car les threads ont des caracteristiques qui leur sont propres), et que le probleme est que les threads du pool sont moins parametrables qu'un thread créé specialement pour l'occasion. bref je ne t'etouffe pas plus sous les details. =p
Pour en revenir à cette ligne :
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
En fait le += est du à la conception des event sous c#. Je ne sais pas si tu es familier des délégués, mais un rappel à tout hasard. Un délégué est une variable qui represente une ou plusieurs fonctions qui ont un commun la signature du délégué. Un event est tres proche d'un délégué, donc en fait dans un event on peut stocker des methodes et les appeler en appelant le délégué. Ici Elapsed de l'objet Timer n'est pas une propriété, mais un evenement, et tu peux lui rattacher des fonctions ayant la meme signature que le délégué sous-jacent de l'event (qui sont des concepts assez proche pour rappel). Un event est appelé à un moment donné par la classe qui gere cette event (ici Timer), en se referant à ta doc, tu verras ici qu'elapsed est lancé quand le timer est fini. Et dans la syntaxe C# pour ajouter une methode à un event, on utilise += (pour info A += B est equivalent à A = A +B) car en fait un event ou un delégué perso, peuvent avoir une multitude de methodes rattachées, elles seront appelées les unes apres les autres quand tu declencheras ton event (ou que tu appelleras ton délégué). Voila pourquoi on utilise += pour etre sur d'ajouter et pas de remplacer.
Un callback est en fait la methode qui sera appelée quand l'evenement sera lancée, ici, dans le troisieme code de mon precedent post, le callback c'est ca :
1 2 3 4 5
|
void myTimer_Elapsed(object sender, system.Timers.ElapsedEventArgs e)
{
/**/
} |
Quand le timer sera ecoulé il enclenchera son event Elapsed, et appellera la methode ci-dessus (qui créera un nouveau thread pour insticiera une nouvelle Form). Il appelle cette methode car je l'ai rattaché ici à l'event Elapsed :
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
donc pour rattacher la methode, j'instancie un nouveau délégué de type ElapsedEventHandler et dans le constructeur, je lui passe la methode a rappeler (d'ou 'Callback') qui doit avoir la meme signature que le délégué sous jacent et sans parenthése. Ici ElapsedEventHandler est de la forme
public delegate void ElapsedEventHandler(object sender, System.Timers.ElapsedEventArgs e)
donc ma methode doit etre de la meme forme ( void X(object sender, ElapsedEventArgs e) ), et ca tombe bien c'est le cas (=p). Derniere chose tu peux aussi voir ceci :
1 2 3 4
|
myTimer.Elapsed += myTimer_Elapsed;
//Au lieu de ...
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed); |
En fait c'est la meme chose, le compilateur fait instancié automatiquement le délégué dans le premier cas, et t'insulte si la methode n'a pas la bonne signature.
Voila, en esperant, que ce soit plus clair, mais ne t'inquietes pas si cela te parait quelque peu esoterique pour le moment, le délégués, events et autres joyeuseté, ne sont pas vraiment simples à apprehender.
Bon courage. =)
Partager