Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1256 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  fin de processus lors d'acces fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fin de processus lors d'acces fichier

n°813154
ruready
Posté le 03-08-2004 à 09:13:10  profilanswer
 

Bonjour,
 
J'ai un probleme lorsque j'accede a un fichier (lecture ou ecriture). Le processus ne se termine pas lorsqu'on quitte mon application (uniquement si on a fait des "ouvrir" ou des "enregistrer" ).
 
Voici par exemple comment je m'y prends pour lire dans un fichier:
 

Code :
  1. String path = fc.getSelectedFile().getPath(); //fc est un FileChooser
  2. try {
  3.  FileReader fr = new FileReader(path);
  4.  BufferedReader br = new BufferedReader(fr);
  5.  //on recupere toutes les donnees:
  6.  FicheProduit produit = new FicheProduit();
  7.  (..) //appels a la methode readLine()
  8.  //fin de lecture du fichier
  9.  br.close();
  10.  fr.close();
  11.  return produit;
  12. }
  13. catch (Exception e){
  14.  //TODO erreur de lecture dans fichier
  15.  new MessageErreurLoad(path);
  16.  return old;
  17. }


 
J'ai bien fait des close comme vous  pouvez le voir. Si vous voyez pourquoi ca fait ca...
 
Merci d'avance


Message édité par ruready le 03-08-2004 à 09:14:07
mood
Publicité
Posté le 03-08-2004 à 09:13:10  profilanswer
 

n°813180
benou
Posté le 03-08-2004 à 09:43:54  profilanswer
 

ca n'a surement rien à voir avec la lecture du fichier...


---------------
ma vie, mon oeuvre - HomePlayer
n°813182
nerisson
Pic-pic
Posté le 03-08-2004 à 09:47:42  profilanswer
 

Et puis il faut mettre les close dans un clause (hi hi hi) finally pour être sûr de bien fermer les fichiers.


---------------
Light is right
n°813197
ruready
Posté le 03-08-2004 à 10:01:44  profilanswer
 

ben le truc c'est que j'ai ce probleme uniquement lors de l'acces au fichier alors je pense que ca viens de ca. (je parle du cas ou j'ai pas d'exception declanchée bien entendu)

n°813318
pascal34
one point !
Posté le 03-08-2004 à 11:14:20  profilanswer
 

System.exit(0);
 
t'as essayé ?

n°813338
ruready
Posté le 03-08-2004 à 11:24:01  profilanswer
 

Ben quand je termine mon application: soit par un menu "quitter" ou par la croix, je fais un dispose().
 
... je vais essayer le System.exit(O)
 
... Ouais! ca marche! c'est cool, merci!
 
Mais je comprend pas pourquoi mon dispose() termine bien le processus lorsque je fais aucun acces aux fichiers mais pas dans le cas ou j'y accede... Enfin le principal c'est que ca marche maintenant.
 
Merci encore


Message édité par ruready le 03-08-2004 à 11:24:40
n°813379
benou
Posté le 03-08-2004 à 11:39:52  profilanswer
 

ruready a écrit :

Mais je comprend pas pourquoi mon dispose() termine bien le processus lorsque je fais aucun acces aux fichiers mais pas dans le cas ou j'y accede... Enfin le principal c'est que ca marche maintenant.


Surement à cause de l'affichage de la fenêtre qui te permet de choisir le fichier.
Elle ne doit pas être "disposée". (faudrait vérifier dans les sources)
 
http://java.sun.com/j2se/1.4.2/doc [...] ssues.html

Citation :


Therefore, a stand-alone AWT application that wishes to exit cleanly without calling System.exit must:  

  • Make sure that all AWT or Swing components are made undisplayable when the application finishes. This can be done by calling Window.dispose on all top-level Windows. See Frame.getFrames.  
  • Make sure that no method of AWT event listeners registered by the application with any AWT or Swing component can run into an infinite loop or hang indefinitely. For example, an AWT listener method triggered by some AWT event can post a new AWT event of the same type to the EventQueue. The argument is that methods of AWT event listeners are typically executed on helper threads.  



une solution est de boucler sur toutes les frames (Frame.getFrames) en appelant dispose dessus ... c'est toujours plus propre qu'un System.exit(0)


---------------
ma vie, mon oeuvre - HomePlayer
n°813574
ruready
Posté le 03-08-2004 à 13:37:35  profilanswer
 

OK, merci, si j'ai le temps je ferais ca plus proprement en "disposant" la frame du filechooser (si ca vient bien de la) (d'ailleurs moi je dispose toutes mes frames alors...) Je trouve quand meme ca un peu bizarre que le la boite de dialogue du filechooser ne se dispose pas toute seule...
Je vous tiens au courant si j'en sais davantage...

n°813586
ruready
Posté le 03-08-2004 à 13:47:29  profilanswer
 

Bon j'ai essayé sur un exemple tout bete: une JFrame et un FileChooser.
 
Si je fais un dispose() en quittant ma JFrame, ca me laisse un processus.
 
Mais en faisant un dispose() de toutes les frames, ca fonctionne. J'ai fais comme tu m'as dit benou: Frame.getFrames() puis une boucle pour toutes les "disposer".
 
Conclusion: La boite de dialogue du JFileChooser ne se dispose pas a sa fermeture.
 
Merci pour ton aide benou!


Message édité par ruready le 03-08-2004 à 13:50:10
n°813600
ruready
Posté le 03-08-2004 à 13:54:04  profilanswer
 

benou a écrit :


c'est toujours plus propre qu'un System.exit(0)


 
En fait c'est quoi la difference? le System.exit(0) doit faire un dispose() de toutes les frames aussi, non?

mood
Publicité
Posté le 03-08-2004 à 13:54:04  profilanswer
 

n°813608
pascal34
one point !
Posté le 03-08-2004 à 14:00:27  profilanswer
 

ruready a écrit :

En fait c'est quoi la difference? le System.exit(0) doit faire un dispose() de toutes les frames aussi, non?


 
Le System.exit(...) termine la jvm en libérant toutes les resources occupées et en renvoyant le code passé en paramètre à l'appelant (windows ou un shell sous linux ou autre). Mais c'est un peu brutal. Y'a pas de dispose() appelé (peut-être que finalize() est appelé sur chaque objet en mémoire), la mémoire occupée est rendue à l'os.
En général, tu le mets en fin de main() pour sortir de la jvm.
 
la méthode main() est lancée dans son propre thread, quand elle se termine , son thread se termine mais si tu as d'autres threads que tu as lancés et que tu n'as pas arrêtés, la jvm peux continuer à tourner. le System.exit() assure qu'on termine la jvm, proprement si tu as fait le ménage avant, ou salement.

n°813613
ruready
Posté le 03-08-2004 à 14:02:18  profilanswer
 

ok merci pour ces precisions

n°813679
benou
Posté le 03-08-2004 à 14:38:17  profilanswer
 

pascal34 a écrit :


En général, tu le mets en fin de main() pour sortir


 :??:  
 
ha bon ?


---------------
ma vie, mon oeuvre - HomePlayer
n°813684
pascal34
one point !
Posté le 03-08-2004 à 14:41:47  profilanswer
 

benou a écrit :

:??:  
 
ha bon ?


 
En général, tu souhaites sortir de la jvm quand ton main se termine.
 
Mais c'est pas une règle générale (cf GUI apps)

n°813686
benou
Posté le 03-08-2004 à 14:42:51  profilanswer
 

on général, la jvm se termine tout seule en fin de main ...


---------------
ma vie, mon oeuvre - HomePlayer
n°813720
pascal34
one point !
Posté le 03-08-2004 à 15:10:53  profilanswer
 

benou a écrit :

on général, la jvm se termine tout seule en fin de main ...


 
Sauf si tu as une application graphique : le thread main se termine et seuls survivent les thread de gestion des evènements et les threads système (gc, ...)
 
ou
 
tu lances un autre thread depuis le main. la jvm ne se termine que si le thread en question se termine (si je me trompe pas).

n°814281
benou
Posté le 03-08-2004 à 22:46:33  profilanswer
 

pascal34 a écrit :

Sauf si tu as une application graphique : le thread main se termine et seuls survivent les thread de gestion des evènements et les threads système (gc, ...)


ben oui, raison de plus pour pas foutre un System.exit(0) en bas du main  [:mlc]

n°814497
pascal34
one point !
Posté le 04-08-2004 à 09:58:19  profilanswer
 

benou a écrit :

ben oui, raison de plus pour pas foutre un System.exit(0) en bas du main  [:mlc]


 
Dans ce cas c'est certain :D  
Faut le mettre ailleurs

n°814569
benou
Posté le 04-08-2004 à 11:13:11  profilanswer
 

pascal34 a écrit :


Faut le mettre ailleurs


mais pkoi tu veux à tout prix le mettre ? :heink:


---------------
ma vie, mon oeuvre - HomePlayer
n°814624
pascal34
one point !
Posté le 04-08-2004 à 11:47:12  profilanswer
 

benou a écrit :

mais pkoi tu veux à tout prix le mettre ? :heink:


 
Je veux pas à tout prix le mettre, mais ça aide parfois.
Dans son cas c'est utile : la méthode dispose() c'est pas à toi de l'appeler normalement !
S'il a fermé toutes les resources, fichiers et autres, il mettre un System.exit(0), pas besoin de passer derrière chaque Frame pour appeler dispose dessus.

n°815487
ruready
Posté le 05-08-2004 à 09:10:26  profilanswer
 

pascal34 a écrit :

Je veux pas à tout prix le mettre, mais ça aide parfois.


 
+1
 
Jusqu'a la j'en avais pas besoin mais dans certains cas comme ca c'est moins galere que de verifier que toutes les Frames se "disposent" bien.

n°815554
benou
Posté le 05-08-2004 à 10:09:10  profilanswer
 

ruready a écrit :

+1
 
Jusqu'a la j'en avais pas besoin mais dans certains cas comme ca c'est moins galere que de verifier que toutes les Frames se "disposent" bien.


Tu pourrais montrer la partie de ton code qui utilise le JFileChooser ?
ca m'étonne cette histoire de dispose qui est pas appelé ...


---------------
ma vie, mon oeuvre - HomePlayer
n°815733
ruready
Posté le 05-08-2004 à 11:55:04  profilanswer
 

benou a écrit :

Tu pourrais montrer la partie de ton code qui utilise le JFileChooser ?
ca m'étonne cette histoire de dispose qui est pas appelé ...


 

Code :
  1. public static FicheProduit load(FicheProduit old){
  2.  //on recupere toutes les données relatives au produit
  3.  JFileChooser fc = new JFileChooser();
  4.  fc.setDialogTitle("Ouvrir..." );
  5.  fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
  6.  //pour filtrer les fichier:        
  7.  ExampleFileFilter filter = new ExampleFileFilter();
  8.  filter.addExtension("bac" );
  9.  filter.setDescription("Plan de Bâche" );
  10.  fc.setFileFilter(filter);
  11.  int result = fc.showDialog(null, "Ouvrir" );
  12.  if (result == JFileChooser.CANCEL_OPTION)
  13.   return old;
  14.     else {
  15.   String path = fc.getSelectedFile().getPath();
  16.   try {
  17.     FileReader fr = new FileReader(path);
  18.     BufferedReader br = new BufferedReader(fr);
  19.     FicheProduit produit = new FicheProduit();
  20.     //on recupere toutes les donnees:
  21.     produit.setReferenceProduit(br.readLine());
  22.     produit.setReferenceClient(br.readLine());
  23.     produit.setNomClient(br.readLine());
  24.     produit.setDate(new Date(Long.parseLong(br.readLine())));
  25.     produit.setType(br.readLine());
  26.     //on recupere les donnees du plan:
  27.     produit.getPlan().load(br);
  28.     br.close();
  29.     fr.close();
  30.     System.out.println("Flag fin FicheProduit.load() ss erreur" );
  31.     return produit;
  32.   }
  33.   catch (Exception e){
  34.    //TODO erreur d'ouverture de fichier
  35.    System.err.println("Flag ERREUR FicheProduit.load()" );
  36.    System.out.println(e);
  37.    //TODO: afficher message d'erreur
  38.    return old; //on renvoie la fiche precedente
  39.   }
  40.     }
  41. }


 
voila

n°816086
benou
Posté le 05-08-2004 à 16:08:02  profilanswer
 

J'ai regardé un peu, ca ressemble à un bug du jdk 1.3.
Voici le même extrait du source de JFileChooser en jdk 1.3 et 1.4 :  
 
JDK1.3.1_02


    public int showDialog(Component parent, String approveButtonText) {
 if(approveButtonText != null) {
     setApproveButtonText(approveButtonText);
     setDialogType(CUSTOM_DIALOG);
 }
 
        Frame frame = parent instanceof Frame ? (Frame) parent
              : (Frame)SwingUtilities.getAncestorOfClass(Frame.class, parent);
 
 String title = getUI().getDialogTitle(this);
 
        dialog = new JDialog(frame, title, true);
        Container contentPane = dialog.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(this, BorderLayout.CENTER);
 
        dialog.pack();
        dialog.setLocationRelativeTo(parent);
 
 rescanCurrentDirectory();
 
        dialog.show();
 return returnValue;
    }


 
JDK1.4.2_01


    public int showDialog(Component parent, String approveButtonText)
        throws HeadlessException {
 if(approveButtonText != null) {
     setApproveButtonText(approveButtonText);
     setDialogType(CUSTOM_DIALOG);
 }
 dialog = createDialog(parent);
 dialog.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
  returnValue = CANCEL_OPTION;
     }
 });
 returnValue = ERROR_OPTION;
 rescanCurrentDirectory();
 
 dialog.show();
 dialog.dispose();
 dialog = null;
 return returnValue;
    }


 
en JDK1.4 y a un dialog.dispose(), pas en JDK1.3 ... ce qui explique le comportement de ton appli (si tu es bien en 1.3)


Message édité par benou le 05-08-2004 à 16:08:29

---------------
ma vie, mon oeuvre - HomePlayer
n°816092
pascal34
one point !
Posté le 05-08-2004 à 16:10:56  profilanswer
 

Jeu, Set et Match pour Benou

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  fin de processus lors d'acces fichier

 

Sujets relatifs
Tester si un fichier existe...Spprimer une ligne dans un fichier
Lancement fichier DOSexecution de fichier!
PHP MyAdmin - insertion de fichier texte => Errcode 2:Can't get stat[VC++6/MFC] Facilités pour gérer une configuration, genre fichier ini?
fichier Global.asa ignoré, pourquoi ?comment connaitre le format ou l'extension d'un fichier ?
Processus sql Sever sous vb.netCréation d'une liste déroulante pour un fichier Excel en VBA
Plus de sujets relatifs à : fin de processus lors d'acces fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR