package application; import graphe.*; import java.awt.*; /** * L'écouteur est un Thread qui fait en permanence la correspondance entre un sommet graphique et la partie algorithmique correspondante. Quand, dans le déroulement de la coloration, un sommet change de couleur, il commande au sommet graphique d'en fait de même. */ public final class Ecouteur extends Thread { /** * Tableau des sommets graphiques */ private SommetDessin sommetD[]; /** * Tableau des sommets à Jeton */ private ColorationJeton colorationJ[]; /** * Tableau pour coloration Distribuée */ private ColorationDistribuee colorationD[]; /** * Nombre de sommets dans le graphe */ private int nbSommets; /** * Graphique où sont dessinés les sommets */ private Graphics g; /** * Cadre de dessin qui reçoit le graphique */ private CadreDessin cadre = null; /** * Type de coloration. * 1 -> Distribué * 0 -> Jeton */ int type; /** * Tant que vrai, exécution de l'écouteur */ private boolean encours = true; //Statistiques /** * Nombre de couleurs utilisées pour la coloration */ private int totalCouleurs; /** * Nombre total de messages échangés */ private int nbMess; /** * Nombre de messages échangés pour la coloration */ private int nbMessCouleur; /** * Temps mis pour la coloration */ private int totalDuree; /** * Getter nombre de messages * @return int */ public final int getNbMess() { return nbMess; } /** * Getter Nombre de messages utilsés pour la coloration * @return int */ public final int getNbMessCouleur() { return nbMessCouleur; } /** * Getter nombre de couleurs utilisées * @return int */ public final int getNbCouleurs() { return totalCouleurs; } /** * Getter de la durée de traitement * @return long */ public final long getDuree() { Integer numerateur = new Integer(nbSommets); Integer denominateur = new Integer(totalDuree + 1); System.out.println(numerateur); System.out.println(denominateur); if (nbSommets / (totalDuree + 1) > 0) return (nbSommets / (totalDuree + 1) + 1); else return (nbSommets / (totalDuree + 1)); } /** * Définit le cadre où est dessiné le graphe */ public final void setCadre(CadreDessin des) { cadre = des; } /** * Setter du type de coloration */ public final void setType(int t) { type = t; } /** * Constructeur */ public Ecouteur( ColorationJeton[] c, SommetDessin[] s, int nbSommets, Graphics g) { sommetD = s; colorationJ = c; colorationD = null; this.nbSommets = nbSommets; this.g = g; start(); } /** * Constructeur */ public Ecouteur( ColorationDistribuee[] c, SommetDessin[] s, int nbSommets, Graphics g) { sommetD = s; colorationD = c; colorationJ = null; this.nbSommets = nbSommets; this.g = g; start(); } /** * Méthode du thread */ public final void run() { if (colorationD == null) ecouteSommetJ(); else ecouteSommetD(); } /** * Se met en écoute sur les sommets de type Jeton */ private final void ecouteSommetJ() { int nbTermine; while (encours) { nbTermine = 0; for (int i = 0; i < nbSommets; i++) { if (sommetD[i].couleur != colorationJ[i].getCouleur()) { sommetD[i].couleur = colorationJ[i].getCouleur(); sommetD[i].paint(g); } if (colorationJ[i].etat.equals("colore")) nbTermine++; yield(); } if (nbTermine == nbSommets) termine(); } } /** * Se met en écoute sur les somemts de type diustribué */ private final void ecouteSommetD() { int nbTermine; while (encours) { nbTermine = 0; for (int i = 0; i < nbSommets; i++) { if (sommetD[i].couleur != colorationD[i].getCouleur()) { sommetD[i].couleur = colorationD[i].getCouleur(); sommetD[i].paint(g); } yield(); if (colorationD[i].etat.equals("colore")) { nbTermine++; } yield(); } if (nbTermine == nbSommets) { try { sleep(1000); } catch (Exception e) { } termine(); } } } /** * Termine tous les processus qui tournent */ private final void termine() { if (cadre != null) { etatSommets(); cadre.destroy(type); encours = false; } } /** * Etat des différents sommets. * Recueille toutes les informations de chaque sommet pour les statistiques */ private final void etatSommets() { totalCouleurs = 0; nbMess = 0; nbMessCouleur = 0; totalDuree = 0; if (type == 1) { for (int i = 0; i < nbSommets; i++) { colorationJ[i].etat(); nbMess += colorationJ[i].getNbMess(); nbMessCouleur += colorationJ[i].getNbMessCouleur(); /* if (colorationJ[i].getDuree() > totalDuree) totalDuree = colorationJ[i].getDuree(); */ if (colorationJ[i].getCouleur() > totalCouleurs) totalCouleurs = colorationJ[i].getCouleur(); } } else { for (int i = 0; i < nbSommets; i++) { colorationD[i].etat(); nbMess += colorationD[i].getNbMess(); nbMessCouleur += colorationD[i].getNbMessCouleur(); if (colorationD[i].getDuree() > totalDuree) totalDuree = colorationD[i].getDuree(); if (colorationD[i].getCouleur() > totalCouleurs) totalCouleurs = colorationD[i].getCouleur(); } } totalCouleurs++; } }