Structure hiérarchique

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