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

API standards et tierces Java Discussion :

faire attendre un programme qu'un événement se déclenche


Sujet :

API standards et tierces Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut faire attendre un programme qu'un événement se déclenche
    Bonjour,

    J'ai une classe JFrame qui implémente plusieurs listeners :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class MyFrame extends JFrame implements ProgressListener, WindowListener, URIContentListener
    dans cette classe est défini une méthode load() qui renvoie un string:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public String load()
    {
    JPanel panel = new JPanel();
    this.getContentPane().add(panel);
    this.setVisible(false);
    this.pack();
    ...
    return s;
    }
    qui déclenche un événement auquel j'associe une action:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void onStateChange(ProgressEvent event)
    {
    //action
    }
    j'aimerais faire ATTENDRE la méthode load() que l'événement (et l'action qui y soit associée) soit terminé avant de renvoyer son résultat 's'?

    merci pour votre aide souvent très utile,

    Fabrisss[/code]

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    regarde du coté des Threads. avec les méthode wait...

  3. #3
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    effectivement tu peux regarder du coté des Threads en faisant un test jusqu'à ce que s est not null ou un truc dans le genre

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Tu fais deux méthode une qui lance la première partie et l'autre que tu lance à la fin de ton traitement...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    merci pour vos pistes de réflexion...

    je ne comprends toutefois pas trop bien à quoi pourrait servir un thread dans mon cas; un thread sert en effet à faire un traitement en parallèle d'un autre afin d'améliorer les performances...

    ici je cherche plutôt à faire l'inverse : séquentialiser
    1. l'appel à la méthode load
    2. l'action associée à l'événement
    3. la fin de la méthode load

    cordialement,

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Alors n'utilise pas les threads et faire deux fonction, l'une que tu utiliseras avant ton Evénement et l'autre après. Bien sur tu dois savoir quand est-ce que ton evénement arrive vu que c'est toi qui modifie l'état.
    Je me fais comprendre ou pas ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    oui, je comprends bien mais le problème est que je ne sais pas dire quand l'événement va être déclenché; il s'agit en fait du chargement d'une page web (avec la librairie jrex) et j'associe une action lorsque la page est complètement chargée (instruction 'if'):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void onStateChange(ProgressEvent event)
    {
    StateChangeEventParam scep=(StateChangeEventParam)event.getEventTypeParam();
    		int statusFlag=scep.getStateFlags();
    		int STATE_FLAGS_LOAD_COMPLETED = (ProgressEventConstants.STATE_STOP | ProgressEventConstants.STATE_IS_WINDOW | ProgressEventConstants.STATE_IS_NETWORK | ProgressEventConstants.STATE_SECURE_HIGH);
    		if(statusFlag==STATE_FLAGS_LOAD_COMPLETED)
    		{
    //la page est complétement chargée -> action !!!
    }
    }

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Mais alors en faite tu veux qu'une certaine partie de ton code soit exécuter seulement lorsque l'événement à eu lieu c'est bien cela ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    oui, en effet, je veux récupérer des informations sur la page web UNIQUEMENT SI elle est complètement chargée

    voici l'ordre idéal des opérations :

    1. load() charge une page web dans un mini-browser -> différents événements sotn générés
    2. lorsque la page est complètement chargée, l'événement onStateChange est généré. la condition (instruction 'if') est alors remplie -> je récupère des infos sur la page web chargée dans le mini-browser
    3. load() reprend la main à ce moment là et renvoie la variable 's' qui contient les infos extraites de la page web

    mon problème concerne le point 3 : je ne parviens pas à faire attendre la méthode load que toute la page soit chargée

    j'espère me bien faire comprendre,

  10. #10
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Une suggestion (si j'ai bien compris ton pb), ca serait d'utiliser un booleen :
    le booleen est passe a vrai en debut d'action et a faux en fin d'action. Dans le load on attend que le booleen soit a faux pour poursuivre le traitement.
    Ca repond a ton pb ?

  11. #11
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Il faut bien voir que la méthode load() est bloquante, donc il est de ton intérêt de ne pas l'appeler depuis l'Event Dispatch Thread, sinon ton ihm ne sera plus réactive le temps d'exécution de la méthode.
    D'autre part, tu peux utiliser un booléen en effet mais surtout fais une pause avec sleep() dans la boucle d'attente pour éviter de consommer tout le temps CPU.

  12. #12
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Je pensais aussi a utiliser une Semaphore, mais pour ca faut etre en 1.5

  13. #13
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Pas forcément, tu peux utiliser les méthodes wait() et notify() de la classe Object.

  14. #14
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    En resume fabrisss, tu peux choisir la solution que tu preferes...

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    la solution du booléen est simple et me fait progresser mais j'ai encore un problème :

    grâce à un attribut booléen 'loaded' défini dans la classe, je peux en effet reprendre le contrôle dans la méthode load lorsque toute la page web est chargée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public String load(){
    ...
    while(!this.loaded)
    {
    continue;
    }
     
    //la page est complétement chargée -> action !!!
    ...
    return s;
    }
    le problème que je rencontre maintenant est que la variable 's' (qui est une variable privée de ma classe) vaut null alors qu'elle est correctemment assignée dans la méthode onStateChange() ?!?

    comprenez-vous pourquoi ?

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    si 's' est un String (comme dans mon illustration), cela fonctionne mais dans mon cas, il s'agit en fait d'un objet de type org.w3c.dom.Document

    et là, 's' vaut null dans la méthode load() alors qu'il est non null dans la méthode onStateChange :-(

  17. #17
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    euh, question bête, c'est bien le même s ???

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    pour simplifier mon exemple, j'ai d'abord considéré que 's' était un string mais en fait, dans mon programme, il s'agit d'un objet de type Document

  19. #19
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    s est variable d'instance ? ça peut t'aider, sinon, au lieu de renvoyer un booléen, tu peux renvoyer s en attendant qu'il passe de null à Object où autre...

  20. #20
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Faut que tu nous montre un peu plus de code, la on voit pas grand chose.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2009, 12h50
  2. Réponses: 6
    Dernier message: 14/02/2008, 12h02
  3. [TP7] Impossible de faire tourner un programme
    Par eleve88 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 10/01/2006, 19h12
  4. [Débutant] [Thread] Faire patienter un programme java....
    Par yoxx dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 25/09/2005, 12h36
  5. Comment faire patienter un programme ?
    Par JlouisI dans le forum Débuter
    Réponses: 4
    Dernier message: 03/03/2003, 11h11

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