IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Problème System.out.println commenté


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème System.out.println commenté
    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 faite. 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.

    Merci d'avance
    Nicolas

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    y a pas de raison que l'absence de la ligne change le comportement de ton code au dela du fait qu'il n'affichera plus le texte mentionné. Il faudrait qu'on voie un peu plus le code pour comprendre l'erreur, mais ca ne fait appel à aucune méthode qui pourrait avoir un effet de bord et c'est pas du à un oubli d'accolade au niveau du if juste avant.

    Pour ce bout de code, tu peux supprimer ta ligne sans soucis.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Malheureusement si cela a une influence car je n'ai pas aucune image si je supprime cette ligne. A priori la lecture n'est pas effective sans ce Println.

    Je pose ici cette question car en fait j'ai déja rencontré ce problème avec un programme en C. Lorsque je supprimai un printf() alors le programme ne marchait plus. J'avais alors réussi à trouver sur le net des personnes avec le même problème que moi et cela venait en fait du buffer d'écriture. J'avais juste eu à ajouter un flush() ou quelque chose comme cela.

    Sinon est-il en effet possible de remplacer l'affichage console inutile par un log qui prenne moins de temps ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    montre nous un code plus complet qu'on te dise ou est l'erreur. println n'a pas d'effet de bord en java et le buffer ne peux pas déborder, donc ca ne peux pas magiquement faire fonctonner un programme ou rater un programme.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Ce type de comportement me fait penser à un problème de synchro entre threads ou de priorité d'exécution.
    L'affichage ne fonctionne plus lorsque ton System.out.println() est en commentaire: c'est peut-être parce que, lorsque tu appelais System.out.println cela provoquait une "pause" dans ton programme; les autres threads avaient alors la possibilité de s'exécuter. Maintenant que l'appel à System.out.println() est en commentaire, ton thread s'execute sans interruption.
    Tu pourrais valider cette hypothèse en remplaçant System.out.println() par Thread.yield()
    Dans tous les cas, supprimer un appel à System.out.println() ne devait pas empecher ton programme de fonctionner. On dirait qu'il y a un grave problème de conception là-dessous.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    J'ai déjà eu un problème de ce type sur une lecture de flux. En local, pas de problème, mais sur serveur distant ça ne marchait plus. Par contre, en ajoutant des log un peu partout en sortie standard pour comprendre pourquoi ça ne marchait pas, le programme refonctionnait par magie.
    L'explication était simple mais fallait y penser : le System.out est "long" à s'exécuter, donc le buffer du flux de lecture avait le temps de se remplir un peu avant la lecture suivante. Il suffisait donc d'augmenter le timeout et d'améliorer l'algo de lecture de flux, notamment en ajoutant une mécanique de reteste sur la méthode "available()" du flux avant de déclarer la mort définitive du serveur distant.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous !!

    Après quelques tests réalisés ce matin, je pensai justement à un problème de synchro. Justement le Println() un peu long permet de ralentir le système je pense et permet le déroulement d'autres threads.
    Je vais donc essayer le Threads.yield() ...

    Effectivement le problème vient de la lecture du flux, car j'utilise la méthode inputstream.available() et lorsque je supprime le Println(), la valeur retorunée est bien plus petite que normalement et ne permet donc qu'un nombre faible de lecture (cf code ci dessous) ...

    Si vous pensez avoir une solution je suis preneur , ou sinon quel timeout dois-je augmenter ? et comment utilise-t-on les logs

    Merci



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    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++;
    				}
     
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
     
    			break;
     
    		default:
    			break;
    		}
    	}

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Synchronise sur la variable input -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (true) {
     int grey = -1;
     if(i<maxpixel) break; //Condition de sortie
     synchronized(input) {
       if(input.available() > 0) {
         grey = input.read();
       } else {
          Thread.sleep(timeout); //timeout pour attendre un petit instant..
       }
     }
     //... reste de ton traitement
    }

  9. #9
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Es-tu sûr que tu n'as pas un meilleur moyen que d'utiliser available() pour ta condition du while ? Le fait qu'available() te retourne 0 ne veut pas nécessairement dire qu'il n'y a plus de données à lire, c'est juste qu'il n'y a pas de données à lire au moment où tu fais l'appel à available(). La nuance est de taille.

    Pourquoi ne pas profiter simplement du fait que la méthode read() est bloquante s'il n'y a pas de données disponibles ? Tu pourrais sortir de ta boucle lorsque tu reçois une exception ou une fin de flux (-1).

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous !
    Alors effectivement c'est clairement un problème de synchronisation entre threads, j'ai essayé les modifications proposées par Hibour et cela semble fonctionner plutôt pas mal
    Par contre je vais tout de même changer la condition de la boucle car en effet la méthode available() est mal utilisée.
    Merci, je vous tiens au courant !

Discussions similaires

  1. Problème d'affichage avec System.out.println
    Par Alucard95 dans le forum Général Java
    Réponses: 6
    Dernier message: 10/12/2008, 15h12
  2. Problème avec System.out.println sous Netbeans
    Par franklin626 dans le forum NetBeans
    Réponses: 2
    Dernier message: 23/04/2008, 16h08
  3. [tomcat] Ou s'inscrit les System.out.println des servlets ?
    Par Shiryu44 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 06/04/2005, 09h26
  4. [tomcat 5] [paramétrage] fichier de log System.out.println
    Par Aldo dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/02/2005, 14h41
  5. [Linux]Problème System.out.println + compiler
    Par Dnx dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/09/2004, 22h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo