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 exécution code malgré utilisation de wait()


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Points : 36
    Points
    36
    Par défaut problème exécution code malgré utilisation de wait()
    Salut tout le monde, lors de l'exécution de mon programme j'ai rencontré un probleme dont j'ai pas trouvé de solution.
    contVect est un String(qui est le résultat d'une execution précédente de mon programme) dont je dois tout d'abord afficher le contenu dans un JTextArea de mon interface graphique nommé textAreaProm et au meme temps ajouter le contenu de contVect dans mon fichier "file.pml".
    just aprés ces 2 actions je passe directement à l'exécutions du processus proc.
    Le probleme est lorsque le contenu de contVect est assez grand et donc l'exécution sera lente et doit prendre du temps pour s'exécuter, le fichier file.pml sera rempli mais pas d'affichage dans le JTextArea textAreaProm .j'ai remarqué que mon programme passe directement à l'exécution du "proc", le message Debut verif s'affiche et le programme se plante.
    J'ai essayé avec les commandes écrites en rouges, le message Debut verif ne s'afficheras plus mais le message echec du test s'affuche en plus de beuacoup d'autres exceptions qui sont les suivantes:
    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
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException
            at java.lang.Object.wait(Native Method)
            at java.lang.Object.wait(Object.java:485)
            at Interface.ConsoleImp$14.actionPerformed(ConsoleImp.java:634)
            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
            at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
            at java.awt.Component.processMouseEvent(Component.java:6263)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
            at java.awt.Component.processEvent(Component.java:6028)
            at java.awt.Container.processEvent(Container.java:2041)
            at java.awt.Component.dispatchEventImpl(Component.java:4630)
            at java.awt.Container.dispatchEventImpl(Container.java:2099)
            at java.awt.Component.dispatchEvent(Component.java:4460)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
            at java.awt.Container.dispatchEventImpl(Container.java:2085)
            at java.awt.Window.dispatchEventImpl(Window.java:2478)
            at java.awt.Component.dispatchEvent(Component.java:4460)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    Voici mon code:


    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
    console.textAreaProm.setText(contVect);
    
    BufferedWriter file=new BufferedWriter(new FileWriter("C:\\jspin\\jspin-examples\\file.pml"));
    
      try {
    
           file.append(contVect).wait();
    
       } catch (InterruptedException ex) {
        Logger.getLogger(ConsoleImp.class.getName()).log(Level.SEVERE, null, ex);
       }
    
      file.close();
    
      Runtime run= Runtime.getRuntime();
      Process proc = null;
      Process proc2 = null;
      Process proc3 = null;
      Process proc4 = null;
    
    String cmd="spin -a -F C:\\jspin\\jspin-examples\\file.prp C:\\jspin\\jspin-examples\\file.pml";  
    String cmd2=".......";
    String cmd3="........";
    String cmd4=".......";
    
      try{
                            //proc4.waitFor();
                              System.out.println("Debut verif");
                              proc=run.exec(cmd);
                              proc.waitFor();
                              System.out.println("Fin verif: pan._ rempli");
    
    
                              System.out.println("Debut compil verifier");
                              proc2=run.exec(cmd2);     
                              System.out.println("Fin compilation");
                              proc2.waitFor();
                              
                              System.out.println("Debut execute verifier");
                              proc3=run.exec(cmd3);         
                              System.out.println("Fin verif: pan.exe");
                             // proc3.waitFor();
    
                              System.out.println("Debut gener .trail");
                              proc4=run.exec(cmd4);
                              System.out.println("Fin gener .trail");
                             
                             }catch(Exception exp){
                             System.out.println("echec du test");
                             exp.printStackTrace();
                        }

    SVP si quelcun a une solution à mon probléme n'hésite pas de me la donner.
    Merci à tous

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Salut,

    Tout d'abord, concernant l'exception que tu affiches, elle vient de la commande wait que tu utilise. Elle ne s'utilise pas comme ca. wait permet de synchroniser l'execution de 2 thread. C'est à dire que si tu n'avais pas d'exeption, tu serais bloqué puisqu'il n'y a pas d'appel à notify() pour debloquer. Mais dans ton cas, tu n'appel pas wait depuis un bloc synchronized d'ou ton exception. Et pour repondre à la question, non, ce n'est pas ce que tu veux faire. Ce wait n'a rien à faire la.

    Par contre, tu fais ce traitement dans quel Thread ? Ca ressemble à un traitement fait dans le thread EDT (celui qui met à jour les composants graphiques). Ce qui explique que ton ihm ne se raffraichisse pas.
    Ce traitement ne serait pas fait dans un actionlistener, mouselistener ou autre ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Bonsoir,
    tout d'abord je veux m'avouer que je comprends pas trop bien les thread, tu peux dire plus ou moins faible.
    mon traitement ne se trouve pas sous un thread mais par contre se fait sous un actionlistner d'un bouton.
    Ce qui m'etonne c'est que lorsque le contenu de contVect est assez grand et donc l'exécution sera lente et doit prendre du temps pour s'exécuter, le fichier file.pml sera rempli mais pas d'affichage dans le JTextArea textAreaProm .
    Meme qd j'ai mit textAreaProm.setText(contVect) avant file.whrite(contVect) il passe directement à l'exécution du fichier et se bloque dans le textAreaProm.

    SVP si vous avez idée sur mon probleme aidez moi.

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Alors, une petite explication (rapide) sur le fonctionnement de swing s'impose. Commencons par le debut : qu'est ce qu'un thread (tache). Une application java, meme la plus simple, fait tourner plusieurs thread qui ont des fonctions différentes (garbage collector, thread de l'application, EDT, ...). Il faut voir les thread comme des programmes qui tournent independamment.
    Il faut savoir qu'avec swing, il y a une tache (thread EDT) speciale qui s'occupe de l'affichage des composants. C'est lui qui les dessine. Theoriquement, tout ce qui touche à l'affichage doit etre fait dans ce thread (changement de texte d'un label/bouton/..., ajout d'un noeud à un treeview, ajout d'une ligne à une table, ...). En pratique, quand on touche aux composants swing hors de ce thread, on tombe aleatoirement sur des exceptions genre "index out of range". Et c'est normale parce que, comme on est sensé utiliser uniquement ce thread pour toucher aux composants swing, ils ne disposent pas de mecanismes de synchronisation (c'est donc plus rapide à l'execution). Mais ca impose de respecter cette regle...
    En ce qui concerne les listener, ils sont egalement appelés dans le contexte de ce thread. Autrement dit, le traitement que tu fais dans ton action listener bloque l'affichage. Tu remarqueras egalement que pendant l'ecriture de ton fichier, tu ne peux pas afficher de menu, cliquer sur un bouton, changer d'onglet, ... dans ton application.

    Pour revenir à ton probleme (et à sa solution), il faut creer un thread qui ecrira dans ton fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Thread t = new Thread() {
     public void run() {
      //Mon traitement long
     }
    };
    t.start();
    Un petit cour sur les threads :
    http://viennet.developpez.com/cours/java/thread/

    Au passage, pour des traitement longs qui necessitent un raffraichissement de l'ihm (genre copie de fichiers ou on veut raffraichir le nombre de fichiers qu'il reste à copier) il existe une classe spéciale (cf javadoc) : swingworker.

    a+

Discussions similaires

  1. Problème exécution code blocks
    Par jordan67 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 02/08/2013, 19h23
  2. Problème exécution code blocks
    Par jordan67 dans le forum Débuter
    Réponses: 8
    Dernier message: 10/09/2012, 09h22
  3. [Web Service] problème exécution code NuSOAP PHP4 / PHP5
    Par Deben59 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 29/05/2012, 11h43
  4. Problème exécution code
    Par mmb04 dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2007, 15h39
  5. [Système] problème d'exécution code php
    Par QuenTinO dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2007, 11h50

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