Travaux Pratiques 5 Annulation de threads Les fourmis contre-attaquent!



Documents pareils
Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Introduction à la programmation concurrente

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

@telier d'initiation

Les processus légers : threads. Système L3, /31

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Les structures de données. Rajae El Ouazzani

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Compression de Données - Algorithme de Huffman Document de Conception

I. Introduction aux fonctions : les fonctions standards

COMPARAISONDESLANGAGESC, C++, JAVA ET

Introduction au langage C

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

StarDraw, le module de dessin de StarOffice 6/7

Interface PC Vivago Ultra. Pro. Guide d'utilisation

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

SOMMAIRE. Présentation assistée sur ordinateur. Collège F.Rabelais 1/10

Programmation système I Les entrées/sorties

DOCUMENTATION VISUALISATION UNIT

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

OS Réseaux et Programmation Système - C5

Java Licence Professionnelle CISII,

Problèmes liés à la concurrence

Le langage C. Séance n 4

Arguments d un programme

Exercices INF5171 : série #3 (Automne 2012)

MANUEL ACHAT à DISTANCE

Programmation système de commandes en C

Programmation système en C/C++

Cours Programmation Système

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

La programmation orientée objet et le langage C++

Gérer ses fichiers et ses dossiers avec l'explorateur Windows. Février 2013

3IS - Système d'exploitation linux - Programmation système

Dessiner dans Galaad FRANÇOIS PALLUT

Fiche Mémo : Options d accessibilité sous Windows et Internet Explorer 5

eurobraille VOYONS ENSEMBLE MANUEL D'UTILISATION WIFI iris 40, 20 iris-s 32, 20 iris-kb 40,20 VERSION 1.82

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var - E mail : bij@agasc.fr / Tel : CONSIGNE N 1 :

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Atelier «personnaliser l environnement de l ordinateur mai 2015

Le prototype de la fonction main()

Programmation C. Apprendre à développer des programmes simples dans le langage C

Comment réaliser une capture d écran dans Word. Alors comment ouvrir une page Word?

Bien travailler sur plusieurs écrans

Plan du cours. Historique du langage Nouveautés de Java 7

Les arbres binaires de recherche

Cours 6 : Tubes anonymes et nommés

LES BIBLIOTHEQUES DE WINDOWS 7

But de cette présentation

Programme Compte bancaire (code)

PAGE 1. L écran du logiciel d Open Office Draw. Barre de menu: Les commandes du logiciel

Programmer en JAVA. par Tama

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

ACTIVITÉ DE PROGRAMMATION

Sauvegarde des données du scribe sur disque USB

Solutions du chapitre 4

Utilisation du logiciel GALAAD

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Rapport de Projet Béatrice Frey et Cyril Crassin Printemps Projet Fourmis. Université de Technologie de Belfort-Montbéliard

Derrière toi Une machine virtuelle!

Programmation Objet - Cours II

AIDE à l utilisation du cédérom «L athlétisme à l école» Niveau Primaire SOMMAIRE

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

TP1 : Initiation à Java et Eclipse

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Organiser vos documents Windows XP

Programmation C++ (débutant)/instructions for, while et do...while

1. Introduction Création d'une requête...2

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Enseignement Informatique. Classe de Bac Pro SAPAT

Débuter avec OOo Base

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Eclipse atelier Java

Répertorier vos mots de passe avec Passbox : 1) Télécharger le fichier d'installation :

Mise en scène d un modèle dans l espace 3D

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Cours LG : Administration de réseaux et sécurité informatique. Dans les Paramètres Système onglet Processeur, le bouton "Activer PAE/NX"

Cours Apl 11 - Introduction à la gestion des écrans

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Mode d emploi Télésauvegarde de données SecureSafe

1. Installation de COMPTINE

NOTICE D' UTILISATION CAMWORKS FRAISAGE. Luc Vallée Lycée Blaise Pascal Segré

COPIER, COUPER, COLLER, SELECTIONNER, ENREGISTRER.

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Exporter des écritures. Importer des écritures. Depuis EBP Comptabilité.

Dans l idéal, ceci devrait être fait en amont pour chaque image envoyée sur l espace de stockage de votre site internet.

TRUCS & ASTUCES SYSTEME. 1-Raccourcis Programme sur le Bureau (7)

Réaliser un PUBLIPOSTAGE

EM398x-R1 UPS VA

TBI-DIRECT. Bridgit. Pour le partage de votre bureau. Écrit par : TBI Direct.

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Transcription:

Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique Travaux Pratiques 5 Annulation de threads Les fourmis contre-attaquent! Pierre Delisle Info0604 2015/2016 L'objectif du TP est de développer une simulation multi-threadée d'un combat de fourmis tueuses en utilisant la bibliothèque pthreads. Pour ce faire, vous vous baserez sur un code source initial que vous pourrez modifier à votre guise tout au long du TP. Étape 1 : prise en main du code source initial Vous pouvez télécharger le code source initial proposé "fourmis.c" sur le site web du professeur : http://cosy.univ-reims.fr/~pdelisle/enseignement.php Compilez et exécutez ce programme. Vous pouvez alors observer l'affichage suivant : La fenêtre SIMULATION contient la grille de simulation contenant plusieurs cases pouvant soit être vides, soit contenir une fourmi, soit contenir un obstacle. La fenêtre MESSAGES contient une description des événements qui se produisent et la fenêtre OUTILS contient les éléments cliquables que vous pouvez placer dans la simulation en cliquant dans la fenêtre SIMULATION. Vous remarquerez que pour l'instant, il ne se passe pas grand chose sur la grille SIMULATION quand vous TP 5 Info0604 1/6

ajoutez une fourmi ou un obstacle : votre tâche consiste à donner vie aux fourmis tueuses en suivant les étapes données ci-dessous. Prenez tout d'abord quelques minutes pour vous familiariser avec ce programme qui est donné et commenté en annexe. Étape 2 : déplacement aléatoire des fourmis Chaque fourmi est simulée par un thread différent et leur comportement est donc défini par le code de la routine de thread appelée routine_fourmi. Comme vous l'avez sûrement remarqué, cette routine ne contient actuellement pas de code et cela explique le peu de dynamisme des fourmis. Vous devez maintenant programmer cette routine afin de permettre aux fourmis de se déplacer aléatoirement sur la grille. Plus spécifiquement, implémentez cet algorithme simple : 1. La fourmi choisit une case au hasard (haut, bas, droite ou gauche) 2. Si la case choisie est vide la fourmi se déplace sur cette case (en modifiant la grille de façon appropriée) Sinon la fourmi ne fait rien 3. Actualiser l'affichage Testez votre implémentation en vérifiant que toutes vos fourmis se déplacent à intervalles réguliers. Comme les fourmis ne font actuellement que se déplacer, la simulation devrait se poursuivre indéfiniment. Étape 3 : destruction des obstacles En vous basant sur l'algorithme de l'étape précédente, vous devez maintenant améliorer vos fourmis en leur injectant une petite dose d'agressivité : lorsque la case choisie contient un obstacle, plutôt que de ne rien faire, la fourmi détruit cet obstacle. Étape 4 : les fourmis ne rigolent plus! L'objectif de ce TP étant de réaliser une simulation de combat de fourmis tueuses, il s'agit maintenant de donner aux fourmis des moyens de remporter le combat. Nous leur ajouterons donc une dose supplémentaire d'agressivité en leur permettant de détruire les autres fourmis. Plus spécifiquement, lorsque la case choisie par une fourmi contient une autre fourmi, plutôt que de ne rien faire, la fourmi détruira cet adversaire qui se trouve sur son chemin. Il est à noter que la destruction d'une fourmi n'implique pas seulement de la faire disparaître de l'affichage : il s'agit aussi d'arrêter l'exécution de son thread. L'annulation doit se faire le plus rapidement possible tout en évitant de perturber le déroulement de la simulation. Cela implique que la fourmi à l'origine de l'agression effectue une requête d'annulation de la fourmi qu'elle élimine. Afin de gérer correctement cette nouvelle agressivité des fourmis, utilisez le mode d'annulation retardé (deferred) et assurez-vous de gérer correctement et proprement cette annulation. La simulation se terminera alors lorsqu'il ne restera qu'une seule fourmi sur la grille. Exercices supplémentaires pour les rapides et les motivés Ajoutez des pièges à la grille : lorsqu'une fourmi est prise dans un piège, elle ne peut plus bouger (pendant un certain temps ou jusqu'à ce qu'elle arrive à détruire le piège). Ajoutez des pastilles magiques à la grille : lorsqu'une fourmi se déplace sur une case contenant une pastille magique, elle devient invincible pendant un certain temps. Ajoutez un comportement d'agression extrême à vos fourmis : la fourmi regarde toutes les cases autour d'elle et tue toutes les fourmis qui s'y trouvent. Attention aux verrous mortels! TP 5 Info0604 2/6

Annexe fourmis.c (Code source initial à compléter/modifier) #define NB_LIGNES_SIM 40 /* Dimensions des fenetres du programme */ #define NB_COL_SIM 80 #define NB_LIGNES_MSG 29 #define NB_COL_MSG 49 #define NB_LIGNES_OUTILS 9 #define NB_COL_OUTILS 49 #define MAX_FOURMIS 10 /* Nombre maximum de fourmis de la simulation */ #define VIDE 0 /* Identifiants des elements pouvant etre */ #define OBSTACLE 1 /* places sur la grille de simulation */ #define FOURMI 2 typedef struct case_tag { /* Description d'une case sur la grille de simulation */ int element; /* Ce qui est present sur la case */ pthread_t *fourmi; /* Identifiant du thread de la fourmi presente sur la case */ pthread_mutex_t mutex; /* Protection de la case */ case_t; typedef struct coord_tag { int y; int x; coord_t; /* Coordonnees d'une case sur la grille de simulation*/ pthread_t *threads_fourmis[max_fourmis]; /*Identifants des threads des fourmis de la simulation*/ case_t grille[nb_lignes_sim][nb_col_sim]; /* Grille de simulation */ WINDOW *fen_sim; /* Fenetre de simulation partagee par les fourmis */ WINDOW *fen_msg; /* Fenetre de messages partagee par les fourmis*/ void ncurses_initialiser() { initscr(); /* Demarre le mode ncurses */ cbreak(); /* Pour les saisies clavier (desac. mise en buffer) */ noecho(); /* Desactive l'affichage des caracteres saisis */ keypad(stdscr, TRUE); /* Active les touches specifiques */ refresh(); /* Met a jour l'affichage */ curs_set(false); /* Masque le curseur */ mousemask(button1_clicked, NULL); /* Active le clic gauche de la souris*/ void ncurses_stopper() { endwin(); void simulation_initialiser() { int i, j; for (i = 0; i < MAX_FOURMIS; i++) /* Au depart il n'y a aucune fourmi dans la simulation */ threads_fourmis[i] = NULL; for (i = 0; i < NB_LIGNES_SIM; i++) { /* Initialisation des cases de la simulation */ for (j = 0; j < NB_COL_SIM; j++) { grille[i][j].element = VIDE; grille[i][j].fourmi = NULL; pthread_mutex_init(&grille[i][j].mutex, NULL); TP 5 Info0604 3/6

void simulation_stopper() { int i; for (i = 0; i < MAX_FOURMIS; i++) { if (threads_fourmis[i]!= NULL) { pthread_cancel(*threads_fourmis[i]); threads_fourmis[i] = NULL; WINDOW *creer_fenetre_box_sim() { /*Creation de la fenetre de contour de la fenetre de simulation */ WINDOW *fen_box_sim; fen_box_sim = newwin(nb_lignes_sim + 2, NB_COL_SIM + 2, 0, 0); box(fen_box_sim, 0, 0); mvwprintw(fen_box_sim, 0, (NB_COL_SIM + 2) / 2-5, "SIMULATION"); wrefresh(fen_box_sim); return fen_box_sim; WINDOW *creer_fenetre_sim() { /* Creation de la fenetre de simulation dans la fenetre de contour */ /* La simulation est affichee dans cette fenetre */ WINDOW *fen_sim; fen_sim = newwin(nb_lignes_sim, NB_COL_SIM, 1, 1); return fen_sim; WINDOW *creer_fenetre_box_msg() { /* Creation de la fenetre de contour de la fenetre de messages */ WINDOW *fen_box_msg; fen_box_msg = newwin(nb_lignes_msg + 2, NB_COL_MSG + 2, 0, NB_COL_SIM + 2); box(fen_box_msg, 0, 0); mvwprintw(fen_box_msg, 0, (NB_COL_MSG + 2) / 2-4, "MESSAGES"); wrefresh(fen_box_msg); return fen_box_msg; WINDOW *creer_fenetre_msg() { /* Creation de la fenetre de messages dans la fenetre de contour */ /* Les messages indicatifs des evenements de la simulation et de l'interface */ /* utilisateur sont affiches dans cete fenetre */ WINDOW *fen_msg; fen_msg = newwin(nb_lignes_msg, NB_COL_MSG, 1, NB_COL_SIM + 3); scrollok(fen_msg, TRUE); return fen_msg; TP 5 Info0604 4/6

WINDOW *creer_fenetre_box_outils() { /* Fenetre de contour de la fenetre des outils */ WINDOW *fen_box_outils; fen_box_outils = newwin(nb_lignes_outils + 2, NB_COL_OUTILS + 2, NB_LIGNES_MSG + 2, NB_COL_SIM + 2); box(fen_box_outils, 0, 0); mvwprintw(fen_box_outils, 0, (NB_COL_OUTILS + 2) / 2-3, "OUTILS"); wrefresh(fen_box_outils); return fen_box_outils; WINDOW *creer_fenetre_outils() { /* Creation de la fenetre des outils a l'interieur de la fenetre de contour */ /* Les outils dans cette fenetre sont clickables, l'outil actif etant indique par un X */ WINDOW *fen_outils; fen_outils = newwin(nb_lignes_outils, NB_COL_OUTILS, NB_LIGNES_MSG + 3, NB_COL_SIM + 3); mvwprintw(fen_outils, 0, 3, "# : Obstacle\n"); mvwprintw(fen_outils, 1, 3, "@ : Fourmi"); mvwprintw(fen_outils, 0, 1, "X"); wrefresh(fen_outils); return fen_outils; void *routine_fourmi(void *arg) { coord_t *coord = (coord_t *) arg; while (1) { /*Que feront les fourmis?!?!?!*/ sleep(1); free(coord); return NULL; int main(int argc, char *argv[]) { WINDOW *fen_box_sim, *fen_box_msg, *fen_msg, *fen_box_outils, *fen_outils; MEVENT event; int ch, i, item_actif = OBSTACLE; coord_t *coord; ncurses_initialiser(); simulation_initialiser(); fen_box_sim = creer_fenetre_box_sim(); fen_sim = creer_fenetre_sim(); fen_box_msg = creer_fenetre_box_msg(); fen_msg = creer_fenetre_msg(); fen_box_outils = creer_fenetre_box_outils(); fen_outils = creer_fenetre_outils(); mvprintw(lines - 1, 0, "Tapez F2 pour quitter"); wrefresh(stdscr); TP 5 Info0604 5/6

while((ch = getch())!= KEY_F(2)) { switch(ch) { case KEY_MOUSE : if (getmouse(&event) == OK) { wprintw(fen_msg, "Clic a la position %d %d de l'ecran\n", event.y, event.x); wrefresh(fen_msg); if (event.y == 32 && event.x >= 82 && event.x <= 98) { item_actif = OBSTACLE; mvwprintw(fen_outils, 0, 1, "X"); mvwprintw(fen_outils, 1, 1, " "); wrefresh(fen_outils); wprintw(fen_msg, "Outil obstacle active\n"); wrefresh(fen_msg); else if (event.y == 33 && event.x >=82 && event.x <= 98) { item_actif = FOURMI; mvwprintw(fen_outils, 0, 1, " "); mvwprintw(fen_outils, 1, 1, "X"); wrefresh(fen_outils); wprintw(fen_msg, "Outil fourmi active\n"); wrefresh(fen_msg); else if (event.y>0 && event.y<nb_lignes_sim+1 && event.x>0 &&event.x<nb_col_sim+1) { switch (item_actif) { case OBSTACLE : pthread_mutex_lock(&grille[event.y - 1][event.x - 1].mutex); if (grille[event.y - 1][event.x - 1].element == VIDE) { grille[event.y - 1][event.x - 1].element = OBSTACLE; mvwprintw(fen_sim, event.y - 1, event.x - 1, "#"); wprintw(fen_msg, "Ajout d'un obstacle a la position %d %d\n", event.y - 1, event.x - 1); wrefresh(fen_sim); wrefresh(fen_msg); pthread_mutex_unlock(&grille[event.y - 1][event.x - 1].mutex); break; case FOURMI : pthread_mutex_lock(&grille[event.y - 1][event.x - 1].mutex); if (grille[event.y - 1][event.x - 1].element == VIDE) { i = 0; while (i < MAX_FOURMIS && threads_fourmis[i]!= NULL) i++; if (i < MAX_FOURMIS) { threads_fourmis[i] = (pthread_t *) malloc(sizeof(pthread_t)); grille[event.y - 1][event.x - 1].element = FOURMI; grille[event.y - 1][event.x - 1].fourmi = threads_fourmis[i]; coord = (coord_t *) malloc(sizeof(coord_t)); coord->y = event.y - 1; coord->x = event.x - 1; pthread_create(threads_fourmis[i], NULL, routine_fourmi, (void *) coord); mvwprintw(fen_sim, event.y - 1, event.x - 1, "@"); wprintw(fen_msg, "Ajout de fourmi a la position %d %d\n", event.y-1, event.x-1); else wprintw(fen_msg, "Nombre maximum de fourmis atteint\n"); wrefresh(fen_sim); wrefresh(fen_msg); pthread_mutex_unlock(&grille[event.y - 1][event.x - 1].mutex); break; break; delwin(fen_box_sim); delwin(fen_sim); delwin(fen_box_msg); delwin(fen_msg); delwin(fen_box_outils); delwin(fen_outils); simulation_stopper(); ncurses_stopper(); return 0; TP 5 Info0604 6/6