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

avec Java Discussion :

PB attent fin d'execution d'un constructeur.


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut PB attent fin d'execution d'un constructeur.
    Bonjour,
    voila mon probleme : je cherche a attendre fin de creation/allocation d'une variable avant d'enchainer la suite de mon script :

    println "debut";
    v_test = new Classe1();
    println "fin";

    Le constructeur de ma classe1 fait bxcp de choses, et notamment genere un fichier.or je peux voir lors de l'execution que mon fichier se trouve generer apres l'affichage de fin.
    Pour la suit de mon programme j'ai besoin justement d'attendre la fin de la creation de ma variable pour pouvoir enchainer.

    Quelles solutions pouvez vous me proposer ?

    PS: j'ai essaye d'etre clair mais en me relisant c'est pas gagné lol.
    Merci !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Par défaut
    Je pense que tu es sur une fausse piste. L'exécution du programme est séquentielle, ce qui veut dire que tant que l'intégralité du code de ton constructeur de Classe1 n'a pas été exécuté, la ligne "println "fin";" n'est pas exécutée.

    Tu n'as donc rien à faire pour "attendre" la fin du constructeur.

    Si ton fichier ne te semble écrit que après l'exécution de la troisième ligne, c'est peut-être parce que le fichier que tu écris n'est pas correctement fermé à la fin du constructeur. On pourrait voir le code pour confirmer ?

  3. #3
    Membre émérite Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Par défaut
    Ou peut être que les instructions situées dans son constructeur travaille sur un Thread différent que le thread courant...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    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
    63
    final class IConversion {
     
    		/**
                     * Type de compression BMP
                     */
     
     
    		/**
                     * Type de compression JPEG
                     */
    		public final static String IMAGE_TYPE_JPEG = "JPEG";
     
    		/**
                     * Conversion sans modification de taille d'un fichier
                     * 
                     * @param fichierSource
                     *            File
                     * @param fichierDestination
                     *            File
                     * @param compressionType
                     *            String
                     */
    		public IConversion(java.io.File fichierSource,
    				java.io.File fichierDestination,
    				String compressionType) {
     
    			// buffer
    			java.awt.image.BufferedImage buf = null;
    			java.awt.image.BufferedImage bufFinal = null;
     
    			// r?cuperation de l'image dans le buffer
    			try {
    				buf = javax.imageio.ImageIO.read(fichierSource);
    			} catch (java.io.IOException ex) {
    				System.out.println("erreur");
    			}
     
    			System.out.println("1");
    			// Cr?ation du buffer final
    			bufFinal = new java.awt.image.BufferedImage(buf.getWidth(), buf.getHeight(),java.awt.image.BufferedImage.TYPE_INT_RGB);
    			System.out.println("2");
    			// Redimensionnement de l'image si volont?
    			java.awt.Graphics2D g = (java.awt.Graphics2D) bufFinal
    					.getGraphics();
    			g
    					.setRenderingHint(
    							java.awt.RenderingHints.KEY_INTERPOLATION,
    							java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
     
    			g.drawImage(buf, 0, 0, buf.getWidth(), buf.getHeight(),
    					null);
    			g.dispose();
     
    			// Ecriture du fichier destination
    			try {
    				javax.imageio.ImageIO.write(bufFinal,
    						compressionType, fichierDestination);
    			} catch (java.io.IOException e) {
    				e.printStackTrace();
    			}
    		}
     
    	}

    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
    class Prog {
     
     
     
     
     
       public static void main (String[] args){
     
     
       	java.io.File srcFile_tConvImg_1 = new java.io.File(	"c:/temp/test1.bmp");
     
     
       	java.io.File desFile_tConvImg_1 = new java.io.File("c:/temp/img/test2.jpeg");
     
       		// CONVERSION DU FICHIER
     
       		System.out.println("debut");
       		new IConversion(srcFile_tConvImg_1, desFile_tConvImg_1,
       				IConversion.IMAGE_TYPE_JPEG);
       		System.out.println("fin");
     
       		// Suite des instructions ....
     
     
     
       }
    }


    Et voila, pour voir la difference il faut se faire un beau bmp de 2Mo minimum.
    Toute ma problematique est donc de'exectuter la suite des instructions apres la création du fichier jpeg de sortie, et ce de preference en évitant de boucler en sortant quand l'existence de celui-ci est confirmer.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Par défaut
    Rien ne me saute aux yeux. J'essaierais simplement de faire un flush() sur le bufFinal avant d'écrire le fichier.

    Sinon, ça vaudrait peut-être le coup d'essayer la surcharge de ImageIO.write qui prend un stream. Tu pourrais forcer le flush sur le flux après l'appel à write, ce qui garantit l'écriture.

    ImageIO.write ne s'amuserait quand même pas à lancer un nouveau thread pour réaliser l'écriture du fichier ?

    Pas d'autre idée pour l'instant...

    [EDIT] Si, une autre idée : récupérer les sources du JDK et aller voir ce que fait ImageIO.write. Ca peut t'éclairer.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Par défaut
    Citation Envoyé par cdefranoux Voir le message
    Rien ne me saute aux yeux. J'essaierais simplement de faire un flush() sur le bufFinal avant d'écrire le fichier.

    Sinon, ça vaudrait peut-être le coup d'essayer la surcharge de ImageIO.write qui prend un stream. Tu pourrais forcer le flush sur le flux après l'appel à write, ce qui garantit l'écriture.

    ImageIO.write ne s'amuserait quand même pas à lancer un nouveau thread pour réaliser l'écriture du fichier ?

    Pas d'autre idée pour l'instant...

    [EDIT] Si, une autre idée : récupérer les sources du JDK et aller voir ce que fait ImageIO.write. Ca peut t'éclairer.
    meric pour la reponse, c'est vrai que pour utiliser le flush je vais devoir surcharger le flux et l'utiliser comme pour l'ecriture d'un fichier classique .... je vias voir ca dans la journee, sinon personne utilise ces classes ?

  7. #7
    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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Ca me paraissait curieux, alors j'ai testé ton programme, en ajoutant des traces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		System.out.println( "debut" );
    		System.out.println( "dest existe : " + desFile_tConvImg_1.exists() );
    		new IConversion( srcFile_tConvImg_1, desFile_tConvImg_1, IConversion.IMAGE_TYPE_JPEG );
    		System.out.println( "dest existe : " + desFile_tConvImg_1.exists() );
    		System.out.println( "fin" );
    Et voici le résultat pour un BMP de 3.6 Mo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    debut
    dest existe : false
    1
    2
    dest existe : true
    fin
    Donc le fichier de destination est créé sans problème de manière séquentielle. Si tu regardes dans l'explorateur windows pour savoir si le fichier est créé au bon moment, ce n'est pas une bonne solution. L'explorateur windows met un peu de temps à se rafraichir.
    Comment fais-tu pour savoir que le fichier de destination est créé après la fin du dernier affichage ? Sur quel OS es-tu ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. [XL-2003] Attente Fin Execution
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/10/2009, 15h37
  2. [C#] Attente fin de thread
    Par ekinox17 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/05/2006, 15h52
  3. [Thread] Connaitre la fin d'execution d'un thread
    Par charmante dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 05/10/2005, 18h57
  4. Fin d'execution non maitrisée
    Par Bideul dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 25/05/2005, 12h40
  5. Réponses: 5
    Dernier message: 11/03/2005, 16h48

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