Question thread java

Fermé
Soufi - 9 sept. 2011 à 21:10
 soufi - 11 sept. 2011 à 16:46
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


A voir également:

6 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
9 sept. 2011 à 21:19
Donne le code qui t'affiche ça pour voir...
0
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
t'as arrivé à comprendre quelque chose de mon code :)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
9 sept. 2011 à 22:14
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
9 sept. 2011 à 23:06
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
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
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
10 sept. 2011 à 23:47
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
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
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
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
11 sept. 2011 à 00:30
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
d'accord car je suis presque débutante dans le programmation java et je vois pas les chose clairement merci en avance beaucoup :)
0