Nico38g
Messages postés5Date d'inscriptionmardi 7 juillet 2009StatutMembreDernière intervention10 juillet 2009
-
7 juil. 2009 à 14:19
Nico38g
Messages postés5Date d'inscriptionmardi 7 juillet 2009StatutMembreDernière intervention10 juillet 2009
-
10 juil. 2009 à 11:11
Bonjour à tous !
Je suis actuellement en stage, et j'ai à reprendre un projet JAVA écrit précédemment.
Le problème que je rencontre est que l'application fonctionne très bien cependant lorsque je commente une ligne avec un '"System.out.println" alors l'appli ne marche plus.
Voici le code mis en cause :
int grey = input.read();
if(grey != -1)
{
System.out.println("Datamanager : Couleur pixel n°"+i+" == "+grey);//Si cette ligne est supprimer aucune lecture est faire. J'ai pas compris pourquoi
this.setPixel(i, grey); //On delegue la responsabilite de la gestion des données d'une image au gestionnaire de données
...
Si quelqu'un pouvait m'aider ça serait cool
J'ai cru voir qu'on pouvait remplacer les println par de log4j, mais je ne sais pas du tout comment faire car finalement l'affichage console de cette information ne m'intéresse pas car il ralentit le programme.
La lecture étant faite à l'intérieur des () du print, si tu supprimes tout, on ne la fait plus...
Supprime donc System.out.println mais garde cette lecture.
Nico38g
Messages postés5Date d'inscriptionmardi 7 juillet 2009StatutMembreDernière intervention10 juillet 2009 8 juil. 2009 à 09:37
Oui bien sur il affiche quelque chose du genre :
"
Datamanager : Couleur Pixel n°18 == 224
"
Avec la lecture de grey réalisé plus haut par grey=input.grey (lecture d'un flux RS232)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Nico38g
Messages postés5Date d'inscriptionmardi 7 juillet 2009StatutMembreDernière intervention10 juillet 2009 8 juil. 2009 à 13:20
En fait je viens de faire quelques test et je me suis rendu compte que le problème ne vient pas de l'affichage mais plutôt du fait que l'utilisation du println() ralentit le programme et alors cela fonctionne.
Si je supprime la ligne les valeurs de grey, i sont bonnes mais je ne parcours plus la boucle suffisemment de fois.
Voici une partie plus importante du code, et le problème vient de input.available() qui, si le println est supprimé, a une valeur bien inferieure :
public void portEvent(PortEvent evt) {
switch (evt.getEventType()) {
//Des données sont disponibles depuis le port
case PortEvent.DATA_AVAILABLE:
//System.out.println("DataManager : Receive PORTEVENT.DATA_AVAILABLE");
InputStream input = null;
try {
input = this.myPort.getInputStream();
int maxpixel = this.mySensorManager.getCurrentSensor().getCapacity(); //height*weight
//Construction d'une image du capteur
int i = 0;
while ((input.available() > 0) && (i<maxpixel)) {
System.out.println("DataManager : Reste "+input.available()+" octets a lire");
//System.out.println("DataManager : Lecture de données");
int grey = input.read();
if(grey != -1)
{
System.out.println("Datamanager : Couleur pixel n°"+i+" == "+grey); //Si cette ligne est supprimer aucune lecture est faire. J'ai pas compris pourquoi
this.setPixel(i, grey); //On delegue la responsabilite de la gestion des données d'une image au gestionnaire de données
if(i == maxpixel-1)
{
System.out.println("DataManager : Demande d'envoi de données d'une nouvelle image");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
this.myPort.getOutputStream().write(1);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else
{
System.out.println("DataManager : Plus aucune données a lire");
}
i++;
}
Kotomine
Messages postés112Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention 5 novembre 2009 9 juil. 2009 à 10:37
Salut, t'es tombé dans un problème classique de conditions de concurrence de type producteur/consommateur on dirait bien.
Fais attention à ton design, et essaye de l'adapter pour que la vitesse du CPU n'influe pas sur le comportement de ton programme ( Pense toujours que c'est ton OS (windows, linux, ..) qui schedule tes threads/applications, et peut te balancer ton datamanager sur un CPU(ou core) 4x plus rapide que celui qui va faire tourner le code qui envoit les données à ton datamanager)
Nico38g
Messages postés5Date d'inscriptionmardi 7 juillet 2009StatutMembreDernière intervention10 juillet 2009 10 juil. 2009 à 11:11
Bonjour !
Merci pour ta réponse car je me suis aperçu que c'est exactement mon problème : synchronisation entre threads ...
J'en avais entendu parler et je viens de l'essayer ...
Je suis en train de résoudre tout ça, je fais au mieux : je change par exemple l'utilisation de la méthode available() car elle était mal utilisée.
Je vous tiens au courant et encore merci !