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

Langage Java Discussion :

IconTray et boucle infinie


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut IconTray et boucle infinie
    Bonjour,

    J'aimerais faire en sorte que mon programme fasse une exécution automatique et infinie tant qu'il est réduit au SytemTray (connais pas vraiment le terme français).

    Seulement, l'IconTray ne veut plus me répondre.

    La boucle se base sur un booléen que l'actionListener et le PopupMenu sont censés passer à faux mais rien n'y fait.

    Alors, où dois je placer ma boucle de traitement pour continuer à avoir une réponse de mon IconTray ?

    Voilà des bouts de code (les plus pertinents pour comprendre) :

    Ma classe hérite de IconTray.

    L'actionListener
    this.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
    est_lance=false;
    coeur.apparaitreInterface();
    }
    });
    La boucle est une classe interne:
    public class Boucle extends Thread {
    public void run() {
    while(est_lance) {
    try {
    taille_change=differenceTaille();
    sleep(intervalle);
    } catch(Exception e) {e.printStackTrace();}
    }
    }
    }
    Le but est donc que le programme continue son traitement jusqu'au clic où il doit passer à autre chose.

    Merci à ceux qui m'aideront.
    Bonne journée.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Il faut au moins rendre est_lance volatile, et ce ne serait pas plus mal de synchroniser son accès.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    J'ai déclaré est_lance en volatile et placer des getters/setters synchronisés.
    Mais ça ne règle pas le souci.

    Mon menu popup et l'actionListener ne semblent toujours pas pris en compte.

    J'ai aussi tenté de passer par un booléen qui récupère la valeur de est_lance à chaque tour mais aucun changement...

    Est ce que "synchronized" peut vraiment m'aider puisque la boucle ne fait que "lire" et les SOP avant l'écriture de est_lance n'apparaissent même pas... En dehors de cette variable, elles n'ont aucune méthode en commun. Le get pour la boucle, le set pour l'actionListener.

    J'ai trouvé sur un site que volatile provoquait la synchro à chaque accès de variable...

    Edit: J'ai testé simplement en faisant 2 classes. Une qui hérite de Thread et qui traite et l'autre qui affiche le IconTray avec gestion du clic. Là ça marche mais dans mon projet avec le traitement plus lourd, ça ne marche plus... D'où peut venir le problème alors ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par Demystificator Voir le message
    Est ce que "synchronized" peut vraiment m'aider puisque la boucle ne fait que "lire" et les SOP avant l'écriture de est_lance n'apparaissent même pas...
    Dans ce cas-là, non ... Si le code n'est même pas atteint, c'est pas très utile d'en synchroniser l'accès.

    Citation Envoyé par Demystificator Voir le message
    D'où peut venir le problème alors ?
    Nous sommes bien d'accord que tu es en train de nous demander qu'est-ce qui peut faire qu'un bout de code censé être atteint n'est jamais atteint dans un programme Java quelconque ?
    Je suggère qu'on s'arrête aux 23 000 premières possibilités, ça risque de mettre le forum à genoux.

    Plus sérieusement, ça peut venir de n'importe quoi, bien sûr.
    Commence déjà par vérifier que ta boucle tourne bien dans un thread à part, et pas sur l'EDT. Et par vérifier que seules les opérations de gestion d'interface synchrones tournent sur l'EDT.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    Merci.

    En fait je ne connaissais pas du tout le fonctionnement de l'EDT mais après des recherches, j'ai trouvé.

    Les 2 threads étaient sur l'EDT et j'ai placé la boucle de traitement en dehors. Ca fonctionne correctement maintenant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 10h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 13h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 09h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 15h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 01h04

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