Les threads les plus utilisés dans le monde linux sont les threads POSIX (ou pthreads). Nous avons par conséquent orienté nos algorithmes de manière à partager l'ensemble des données.
Comme nous l'avons vu précédemment, chaque axe appartenant aux différentes plantes, est muni d'un thread. Ce thread a pour seule tâche la pousse de l'axe. De plus, le nombre de threads total est obligatoirement borné, car sans cela, nous nous retrouverions avec une génération de threads exponentielle et infinie ! Aussi, chaque thread possède un booléen précisant si celui-ci est actif ou non.
Cette limitation du nombre de threads nous impose l'utilisation d'une pile de type FIFO (first-in, first-out), où chaque thread non actif, mais activable, est ajouté. Lors de la mort d'un thread (quand un axe a fini sa croissance), celui-ci appelle le gestionnaire de threads pour lui signaler son décès. Le gestionnaire active ensuite simplement le premier thread en attente.
Voici les algorithmes principaux que nous avons manipulés lors de la phase de codage du logiciel :
+ Algorithme d'un thread :
Préciser que le thread est Actif TantQue l'axe doit encore évoluer Faire Faire pousser l'axe d'une longueur dl attendre dt FinTantQue Préciser que le thread est Inactif Alerter le gestionnaire des threads en attente qu'un thread vient de mourir Exit Fin+ Algorithme du programme de pousse :
Pour toutes les plantes Pour tous les axes Activer le thread de l'axe si thread non Activé alors Ajouter ce thread à la liste des threads en attente FinSi FinPour FinPour TantQue pas Arrêt Attendre FinTantQue Fin+ Algorithme de pousse d'un axe (d'une longueur : dl) :
Si le nombre de cycles >= Nombre de cycles max Alors Arrêter Axe Fin FinSi Pour toutes les apparitions de noeuds AN Faire Si dl > AN.dl Alors Axe.FairePousser(AN.dl-dl) InsererNoeud(AN.dl) FinSi FinPour Si aucun noeud n'est apparu alors Axe.FairePousser(dl) FinSi Mettre à jour le nombre de cycles (si nécessaire) Fin
Remarques :
+ Limitation du nombre de threads : NBMAXTHREADS = 100.
+ Lorsque l'on manipule des threads (sorte de processus légers partageant leurs données), il est impératif d'ajouter des exclusions mutelles ! Nous avons donc protégé deux variables : le nombre courant de threads actifs (modifié lors de la création et la suppression d'un thread), et la pile de threads en attente (insertion, extraction).
+ L'affichage en temps réel des plantes est effectué par un timer, dont l'objet est de parcourir l'ensemble des axes (de toutes les plantes), et d'appeler la méthode Dessiner() (méthode appartenant à la classe Axe). Aucune liste n'est par conséquent créée puisqu'elle serait reconstruite à chaque rafraîchissement ! En effet, même si un axe n'évolue plus, sa largeur est modifiée tout le temps ! Un parcours de l'ensemble des plantes est donc impératif.
julien michot 2006-08-05