Question thread java

Soufi -  
 soufi -
Bonjour,

j'ai un programme alarme d'un réacteur nucléaire qui a 4 capteurs,3 collecteurs, et un contrôleur.
chaque Capteur est un processus qui va envoyer la température au collecteur dans une durée inférieure à deltat(on le donne un valeur fixe). Et la mesure compté fiable si au moins 3 sur 4 des capteurs envoie le mm valeur.Dans ce que là la défaillance de 2 capteurs ou plus ne peut pas considérer comme mesure fiable.
Et puis on fais la comparaison de la température commune avec le seuil. S'il est plus grand que la dernière alors un message "alarme-température" est envoyé. sinom "température normale". Et dans le cas ou il y a défaillance de mesure on envoie "défaillance-température" .
Alors le controleur recue le message : pour le 1 message on Affiche le couleur rouge.
pour le deuxième on affiche le couleur vert
et pour le dernier j'affiche le couleur orangé.
Est ce que s'il vous plais m'aidez à comprendre comment je peux le coder ce probème ?
Merci en avance :)
Je dois faire un programme parallèle.
Moi j'ai commencé à faire le programme mais il y une bug qui s'affiche,
0
0
0
0
Reponses[0]null
la valeure de la température :344499675
le delai : 89
la valeure de la température :139567111
le delai : 74
la valeure de la température :684954004
le delai : 3
c'est bien
température-normale
défaillance
la valeure de la température :-1883963070
le delai : 14
c'est bien
température-normale
défaillance
c'est bien
température-normale
Exception in thread "Thread-7" java.lang.NullPointerException
at Collecteur.run(Collecteur.java:21)
défaillance

pour les premier valeure normalement les valeures des températures mais je ne sais pas pour quoi ils sont nul ?!!!!
et méme les réponse aussi sont nul ??!!!!
normalement il me retourne les messages :température-normale ou défaillance
Est ce que vous pouvez m'aidez et m'expliquez s'il vous plais. Si vous voulez je vous envoie le code sur le forum merci en avance

6 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Donne le code qui t'affiche ça pour voir...
    0
  2. Soufi
     
    la classe capteur:

    import java.util.Random;

    public class Capteur extends Thread {
    static public int chanel;
    int i=0;
    static int temperature ;
    private static Random rand = new Random(System.currentTimeMillis());
    static int lindat2;

    public Capteur() {
    // TODO Auto-generated constructor stub

    }
    public int EnvoyerValeureTemperature(Controleur C)
    {
    C.chanel=temperature;
    return C.chanel;

    }
    public void run() {
    try{

    {
    System.out.println( "la valeure de la température :"+ (rand.nextInt()));
    temperature=(int) (Math.random()*60);
    chanel= temperature;
    System.out.println( "le delai : " + (int) (Math.random()*100) );
    sleep( 5000);
    }
    }
    catch(InterruptedException e)
    {
    }

    }
    }
    la classe collecteur:

    class Collecteur extends Thread
    {

    String[] chaineReponse = new String [3];

    public Collecteur(String[] Tableau)
    {
    chaineReponse=new String [3];
    chaineReponse[0]=Tableau[0];
    chaineReponse[1]=Tableau[1];
    chaineReponse[2]=Tableau[2];
    }

    public void run()
    {

    synchronized(System.out)
    {

    if(this.chaineReponse[0].contentEquals("ALarme température")==false
    || this.chaineReponse[1].contentEquals("ALarme température")==false|| this.chaineReponse[2].contentEquals("ALarme température")==false)
    {
    System.out.println("couleur rouge");
    }

    else if(chaineReponse[0].compareTo("défaillance")==0 ||
    chaineReponse[1].compareTo("défaillance")==0 ||
    chaineReponse[2].compareTo("défaillance")==0 &&
    chaineReponse[0].compareTo("défaillance")==1 ||
    chaineReponse[2].compareTo("défaillance")==1 ||
    chaineReponse[3].compareTo("défaillance")==1
    &&
    chaineReponse[1].compareTo("Alarme température")==1 ||
    chaineReponse[2].compareTo("Alarme température")==1 ||
    chaineReponse[3].compareTo("Alarme température")==1)
    {
    System.out.println("couleur orangé");
    }

    else
    {
    System.out.println("couleur verte");

    }
    try {
    sleep(500);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } }
    }
    }
    et la classe controleur
    import java.util.Random;

    public class Controleur extends Thread {
    static int chanel;
    public String chaineReponse;
    String[] chainedesReponses = new String [3];
    private static final int deltat=400;
    private final int seuil=56;

    Capteur C1 , C2 , C3 , C4 ;
    int[] temperature = new int [4];
    int[] delai =new int[4];
    public Controleur(int [] tableau, int[] tableau2)
    {
    for(int i=0;i<4; i++)
    {
    temperature[i]=tableau[i];
    }
    for(int i=0;i<4; i++)
    {
    delai[i]=tableau2[i];
    }
    }
    public Controleur()
    {

    }

    public void run()
    {

    Collecteur c;

    try {
    if (this.delai[0]<deltat && this.delai[1]<deltat && this.delai[2]<deltat && this.delai[3]<deltat)
    {
    if(this.temperature[0]==this.temperature[1] && this.temperature[0]==this.temperature[2] && this.temperature[0]==this.temperature[3] && this.temperature[0]<seuil)
    {
    System.out.println("c'est bien");
    this.chaineReponse="température-normale";
    System.out.println(this.chaineReponse);

    }
    else if (this.temperature[1]>=seuil)
    {
    System.out.println("c'est bien");
    this.chaineReponse="Alarme température";
    System.out.println(this.chaineReponse);

    }
    else
    System.out.println("défaillance");
    this.chaineReponse="défaillance";
    System.out.println(this.chaineReponse);

    }

    sleep(deltat);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    0
  3. Soufi
     
    t'as arrivé à comprendre quelque chose de mon code :)
    0
  4. KX Messages postés 19031 Statut Modérateur 3 020
     
    Plusieurs remarques et erreurs potentielles :

    * class Capteur

    Dans envoyerValeureTemperature(Controleur c)
    chanel est static donc si tu modifies C.chanel tu modifies la valeur de chanel pour tous les objets

    * class Collecteur

    Dans run, avec tous tes String, tu dois utiliser des constantes, une petite faute de frappe et ton programme est totalement faux, par exemple tu écris de deux manières "Alarme température", parfois avec L minuscule, et parfois avec un L majuscule !
    Remarque : equals, est plus approprié que contentEquals
    De plus tu mélange les || et les && alors qu'il te faut une forme normale et donc rajouter des parenthèses.
    Enfin, compareTo renvoie un nombre positif, négatif ou nul, mais ce n'est pas nécessairement 1 et -1, ça peut très bien être 3, -2... De plus je ne vois pas pourquoi l'ordre lexicographique interviendrait ici

    * class Controleur

    Idem pour les constantes de String, d'autant que ce sont les même, il faut qu'il y ait correspondance absolue pour pouvoir les comparer, sinon ça ne sert à rien !
    De plus pour le else final, tu as il me semble oublié les accolades.

    Voilà tout ça c'est "juste" les erreurs que je vois d'emblée, sans même avoir besoin de réfléchir à ce que tu fais (ou essaye de faire). En particulier j'ai pas du tout regardé où étaient les thread, s'ils étaient protégés, qui appelle qui etc... De toute façon je n'ai pas la méthode main pour tester !

    Bref, il te reste pas mal de boulot ! Mais les erreurs les plus évidentes sont dans toutes mes explications au-dessus... Bon courage pour la suite !

    import java.util.Random;
    
    class Commun
    {
    	public static final String TEMPERATURE_NORMAL = "Température normale";
    	public static final String ALARME_TEMPERATURE = "Alarme température";
    	public static final String DEFAILLANCE = "Défaillance";
    }
    
    class Capteur extends Thread 
    {
    	static public int chanel;
    	int i=0;
    	static int temperature ;
    	private static Random rand = new Random(System.currentTimeMillis());
    	static int lindat2;
    	
    	public int EnvoyerValeureTemperature(Controleur C)
    	{
    		C.chanel=temperature;	// TODO
    		return C.chanel;		// TODO
    	}
    
    	@Override
    	public void run() 
    	{
    		try
    		{
    			System.out.println("la valeure de la température : "+ (rand.nextInt()));
    			temperature=(int) (Math.random()*60);
    			chanel= temperature;
    			System.out.println("le delai : " + (int) (Math.random()*100) );
    			sleep(5000);
    		}
    		catch(InterruptedException e)
    		{
    			e.printStackTrace();
    		}	
    	}
    }
    
    //-----------------------------------------
    
    class Collecteur extends Thread
    {	
    	String[] chaineReponse = new String [3];
    	
    	public Collecteur(String[] Tableau)
    	{
    		chaineReponse=new String [3];
    		chaineReponse[0]=Tableau[0];
    		chaineReponse[1]=Tableau[1];
    		chaineReponse[2]=Tableau[2];
    	}
    	
    	@Override
    	public void run()
    	{
    		synchronized(System.out)
    		{
    			if (!chaineReponse[0].equals(Commun.ALARME_TEMPERATURE)
    			 || !chaineReponse[1].equals(Commun.ALARME_TEMPERATURE)
    			 || !chaineReponse[2].equals(Commun.ALARME_TEMPERATURE))
    			{
    				System.out.println("couleur rouge");
    			}
    			else if 
    				(
    					(	chaineReponse[0].compareTo(Commun.DEFAILLANCE)==0 
    					||	chaineReponse[1].compareTo(Commun.DEFAILLANCE)==0
    					||	chaineReponse[2].compareTo(Commun.DEFAILLANCE)==0
    					)
    				 && 
    				 	(	chaineReponse[0].compareTo(Commun.DEFAILLANCE)>0
    				 	||	chaineReponse[2].compareTo(Commun.DEFAILLANCE)>0
    				 	||	chaineReponse[3].compareTo(Commun.DEFAILLANCE)>0
    				 	)
    				 &&
    				 	(	chaineReponse[1].compareTo(Commun.ALARME_TEMPERATURE)>0
    				 	||	chaineReponse[2].compareTo(Commun.ALARME_TEMPERATURE)>0
    					||	chaineReponse[3].compareTo(Commun.ALARME_TEMPERATURE)>0)
    				)
    			{
    				System.out.println("couleur orangé");
    			}
    			else
    			{
    				System.out.println("couleur verte");
    			}
    			try
    			{
    				sleep(500);
    			}
    			catch (InterruptedException e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}
    }
    
    //-----------------------------------------
    
    class Controleur extends Thread 
    {
    	static int chanel;
    	public String chaineReponse;
    	String[] chainedesReponses = new String[3];
    	private static final int deltat=400;
    	private final int seuil=56;
    
    	Capteur C1 , C2 , C3 , C4 ;
    	int[] temperature = new int [4];
    	int[] delai =new int[4];
    	
    	public Controleur(int [] tableau, int[] tableau2)
    	{
    		for(int i=0;i<4; i++)
    			temperature[i]=tableau[i];
    		
    		for(int i=0;i<4; i++)
    			delai[i]=tableau2[i];
    	}
    
    	@Override
    	public void run()
    	{
    		try 
    		{
    			if (delai[0]<deltat && delai[1]<deltat && delai[2]<deltat && delai[3]<deltat)
    			{
    				if (temperature[0]==temperature[1] && temperature[0]==temperature[2] && temperature[0]==temperature[3] && temperature[0]<seuil)
    				{
    					System.out.println("c'est bien");
    					chaineReponse=Commun.TEMPERATURE_NORMAL;
    					System.out.println(chaineReponse);
    				}
    				else if (this.temperature[1]>=seuil)
    				{
    					System.out.println("c'est bien");
    					chaineReponse=Commun.ALARME_TEMPERATURE;
    					System.out.println(chaineReponse);				
    				}
    				else
    				{
    					System.out.println("défaillance");				
    					chaineReponse=Commun.DEFAILLANCE;
    					System.out.println(chaineReponse);
    				}				
    			}
    			
    			sleep(deltat);
    		}
    		catch (InterruptedException e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Soufi
     
    Merci en tous cas
    Pourquoi t'as fais une classe commun, tu peux m'expliquez s'il vous plais,
    en plus j'ai la même exécution.
    j'ai un autre question comment je peux vérifier si le messages sont bien envoyé au contrôleur? Parce que là j'ai fais dans le main tous un tableau qui contient tous les valeurs des réponses mais ca m'affiche des null
    je vais te montre les résultats de l'exécution:

    0
    0
    0
    0
    Reponses[0]null
    la valeure de la température : 1315316311
    le delai : 6
    la valeure de la température : 1880340451
    le delai : 56
    c'est bien
    Température normale
    c'est bien
    Température normale
    la valeure de la température : 370014772
    le delai : 57
    la valeure de la température : 105530029
    le delai : 76
    c'est bien
    Température normale
    Exception in thread "Thread-7" java.lang.NullPointerException
    at Collecteur.run(Collecteur.java:20)

    Et d'après toi qu'est ce qu'il manque encore dans mon travail car vraimanent je ne sais pas qu'est ce que je doit faire
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      J'ai fait une classe Commun pour référencer les constantes qui sont communes aux différentes classes. Par exemple tu fais chaineReponse="Alarme température" avec un L minuscule dans la classe Controleur, mais tu fais chaineReponse[0].contentEquals("ALarme température") avec un L majuscule. Du coup le contentEquals sera forcément faux à cause d'une faute de frappe alors que si tu utilises une constante le compilateur te dira tout de suite quand tu fais une erreur de frappe, parce que soit il connaît la constante, soit il ne la connait pas.

      Pour le main, je ne l'ai pas, donc je n'ai pas testé, et comme je t'ai dit je n'ai pas du tout lu ton sujet, je me suis contenté de corriger les erreurs de programmation (ce qui est déjà pas mal), donc je ne sais pas ce que tu as fait ou doit faire.
      Par contre pour l'erreur de pointeur je ne sais pas à quoi correspond exactement la ligne 20 chez toi, mais c'est sûrement l'un des chaineReponse[] qui n'est pas initialisé (qui vaut null par défaut) mais je ne sais pas comment tu appelles ta classe de Collecteur dans le main, mais c'est forcément lié à ton paramètre String[] Tableau
      0
  7. soufi
     
    bonsoir, s'il vous plait j'ai une question à propos l'affichage des valeurs des températures mais il m'a parait qu'ils ne sont pas juste, je pense que les capteurs n'arrivent pas à envoyer les températures aux collecteurs? jevous donne le code de main
    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int [] deltat= new int[4];
    		int[]   lesTemperature= new int[4];
    		Capteur C1= new Capteur();
    		Capteur  C2= new Capteur(); 
    		Capteur  C3= new Capteur();
    		Capteur C4= new Capteur();
    		
    		int l= C1.lindat2;
    		int l2=C2.lindat2;
    		int l3=C2.lindat2;
    		int l4=C2.lindat2;
    		deltat[0]=l;
    		deltat[1]=l2;
    		deltat[2]=l3;
    		deltat[3]=l4;
    		 ;
    		Controleur CL1 =new Controleur(lesTemperature,deltat);
    		Controleur CL2 =new Controleur(lesTemperature, deltat);
    		Controleur  CL3=new Controleur(lesTemperature, deltat);
    	   
    	    
    	    Collecteur C;
    	    C = new Collecteur();
    		//on lance les 4 cmpteurs pour avoir les 4 températures
    	    C1.start();
    		C2.start();
    		C3.start();
    		C4.start();
    		// on lance les collecteurs pour avoir les réponses 
    		
    		// on lance le Contoleur
    	
    		CL1.start();
    		CL2.start();
    		CL3.start();
    		C.start();
    	}
    
    }
    
    
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      C'est le même problème que celui que j'ai relevé hier, tu as un problème à l'initialisation de ta classe Collecteur, tu ne lui passe pas de tableau en paramètre !
      En conséquence chaineReponse n'est jamais initialisé et tout le reste ne sers à rien...

      Autres remarques : lindat est static, donc C1.lindat, C2.lindat... sont une seule et même valeur ! Surtout si en plus tu utilises trois fois C2.lindat !!!
      Vérifies toutes variables est-ce qu'elles doivent être static ou non, ça change tout si elles le sont ou non.

      public static void main(String[] args) 
      {
      Capteur C1 = new Capteur(),
      	C2 = new Capteur(), 
      	C3 = new Capteur(),
      	C4 = new Capteur();
      		
      int[] deltat= new int[] {C1.lindat2,C2.lindat2,C3.lindat2,C4.lindat2};
      int[] lesTemperature= new int[] {0,0,0,0}; // TODO
      
      Controleur	CL1 = new Controleur(lesTemperature, deltat),
      		CL2 = new Controleur(lesTemperature, deltat),
      		CL3 = new Controleur(lesTemperature, deltat);
          
      Collecteur C = new Collecteur(new String[] {"","",""}); // TODO
      
      //on lance les 4 Compteurs pour avoir les 4 températures
      C1.start();
      C2.start();
      C3.start();
      C4.start();
      		
      // on lance les Controleur	
      CL1.start();
      CL2.start();
      CL3.start();
      
      // on lance le Collecteur pour avoir les réponses		
      C.start();
      }
      0
    2. soufi
       
      mais si je le passe pas un tableau en paramètre comment je peux enregistrer les valeurs des températures de chaque capteur envoyée , est ce que vous avez une idée
      0
    3. soufi
       
      car ici chaque capteur va envoyer un valeur. Et il en faite 3 controleur qui vos enregistrer les températures envoyées affin de vérifier la fiabilité des capteurs
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      Si tu ne passes pas le tableau en paramètres tu vas te retrouver avec le NullPointerException que tu as depuis l'autre jour. Pour le reste comme je t'ai dit je n'ai pas regardé ce que tu devais faire et ce que tu avais fait... Demain peut-être ;-)
      0
    5. soufi
       
      d'accord car je suis presque débutante dans le programmation java et je vois pas les chose clairement merci en avance beaucoup :)
      0