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

Eclipse Platform Discussion :

Update d'un ContributionItem par un thread


Sujet :

Eclipse Platform

  1. #1
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut Update d'un ContributionItem par un thread
    Bonjour,

    J'ai ajouté un ContributionItem dans la statusLine qui me sert aussi à savoir si je suis en acquisition de trace : j'ai un led qui passe à vert quand je suis en acquisition et à rouge quand c'est pas le cas dans la perspective de debug.
    J'ai un thread qui scrute ça et qui change l'image de mon ContributionItem.
    Ca marche très bien, sauf que mon statusLine n'est pas mis à jour tout le temps :
    - au lancement du debug, il est update par un update dans la BreakpointView ou par la ModulesView ...
    - lorsque l'utilisateur clique dans une vue de la perspective de Debug ...
    J'aimerais pouvoir le mettre à jour quand j'estime qu'il faut changer la couleur du led pour indiquer un changement d'état MAIS quand dans ma classe ContributionItem je fait un update sur la statusLine via mon thread ça crash et j'ai une exception sur l'update de la StatusLine "Invalid thread access"

    Limite je trouve ça normal je suis pas dans le bon thread ... mais comment je peux faire pour causer au thread Main d'Eclipse depuis mon petit thread à moi ?

    je nage dans le flou .... merci pour toute aide !
    Chris

  2. #2
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    j'ai trouvé un bon article qui explique tout :
    http://www.vogella.com/tutorials/Ecl...s/article.html

    je suis pas en Eclipse 4 ... mais 3 !

    Comment feriez-vous ?

  3. #3
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    "Invalid thread access" est très explicite
    Tu essaies de mettre à jour ton ContributionItem en dehors du thread IHM. Tout simplement.
    Du coup, pour remédier à ça, il te faut utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Display.getDefault().syncExec(new Runnable() {
        public void run() {
            // ...
        }
    });
    syncExec() pouvant être remplacé par asyncExec() si tu veux faire cette mise à jour de manière asynchrone.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  4. #4
    Membre émérite
    Avatar de Mickael_Istria
    Homme Profil pro
    Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Inscrit en
    Juillet 2008
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 469
    Points : 2 997
    Points
    2 997
    Par défaut
    Citation Envoyé par kkt8 Voir le message
    Limite je trouve ça normal je suis pas dans le bon thread ... mais comment je peux faire pour causer au thread Main d'Eclipse depuis mon petit thread à moi ?
    Est-ce que Display.asyncExec/syncExec fait l'affaire pour ce use-case ?
    Pour du HTML, CSS, JavaScript, TypeScript, JSon, Yaml, Node... dans Eclipse IDE, installe Eclipse Wild Web Developer
    Pour du Rust dans Eclipse IDE, installe Eclipse Corrosion
    Follow me on twitter

  5. #5
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Gueritarish Voir le message
    Salut,

    "Invalid thread access" est très explicite
    Tu essaies de mettre à jour ton ContributionItem en dehors du thread IHM. Tout simplement.
    Du coup, pour remédier à ça, il te faut utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Display.getDefault().syncExec(new Runnable() {
        public void run() {
            // ...
        }
    });
    syncExec() pouvant être remplacé par asyncExec() si tu veux faire cette mise à jour de manière asynchrone.

    Voilà, à+
    Gueritarish
    Hello Gueritarish,

    ce code là je le met ou ?
    pas mon thread ?
    dans le code qui appelle mon thread ?

    j'ai bien compris le principe mais l'utilisation n'est pas claire ...

    a+

  6. #6
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    Si je fais ça :

    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
     
    public class LedThread extends Thread{
     
    	StatusLineLedNexusContributionItem ledTrace;
     
    	public LedThread(Object obj) {
    		ledTrace = (StatusLineLedNexusContributionItem)obj;
    	}
     
     
    	public void run() {
     
    		Display.getDefault().syncExec(new Runnable() {
    			public void run() {}
                                });
                  }
    }
    mon workbench ne répond plus .... j'ai essayé aussi async, même résultat !
    je vais tente le job ....

  7. #7
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Il te faut juste l'utiliser quand tu souhaites mettre à jour ton ContributionItem.
    Donc, ça sera à utiliser dans ton thread et chaque fois que tu veux faire la mise à jour, tu "encadres" cette mise à jour du sync / async.

    !!! Attention à ne pas utiliser le thread IHM pour faire ton traitement.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  8. #8
    Membre émérite
    Avatar de Mickael_Istria
    Homme Profil pro
    Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Inscrit en
    Juillet 2008
    Messages
    1 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 469
    Points : 2 997
    Points
    2 997
    Par défaut
    Citation Envoyé par kkt8 Voir le message
    je vais tente le job ....
    AMHA, dans Eclipse, mieux vaut toujours preferer les Jobs aux Threads. C'est plus simple et mieux integre et souvent ca fait suffisemment ce qu'on veut.
    Dans le "run" de ton job, il vaut mieux utiliser des Display.syncExec parce que ton job est deja asynchrone, donc tu peux faire des attentes synchrones dedans et comme ca tu sais que quand ton job est fini, il a fait son boulot et qu'il n'y a plus rien a attendre.
    Pour du HTML, CSS, JavaScript, TypeScript, JSon, Yaml, Node... dans Eclipse IDE, installe Eclipse Wild Web Developer
    Pour du Rust dans Eclipse IDE, installe Eclipse Corrosion
    Follow me on twitter

  9. #9
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Gueritarish Voir le message
    Il te faut juste l'utiliser quand tu souhaites mettre à jour ton ContributionItem.
    Donc, ça sera à utiliser dans ton thread et chaque fois que tu veux faire la mise à jour, tu "encadres" cette mise à jour du sync / async.

    !!! Attention à ne pas utiliser le thread IHM pour faire ton traitement.

    Voilà, à+
    Gueritarish
    Yes ! ça marche MERCI !!!

  10. #10
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Mickael_Istria Voir le message
    AMHA, dans Eclipse, mieux vaut toujours preferer les Jobs aux Threads. C'est plus simple et mieux integre et souvent ca fait suffisemment ce qu'on veut.
    Dans le "run" de ton job, il vaut mieux utiliser des Display.syncExec parce que ton job est deja asynchrone, donc tu peux faire des attentes synchrones dedans et comme ca tu sais que quand ton job est fini, il a fait son boulot et qu'il n'y a plus rien a attendre.
    Merci Mickael !
    je vais quand même regarder du côté des Job par curiosité !

  11. #11
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Citation Envoyé par kkt8 Voir le message
    Yes ! ça marche MERCI !!!
    T'en doutais?

    Avec plaisir (pour le coup de main).

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  12. #12
    Membre habitué Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Points : 193
    Points
    193
    Par défaut
    un peu ... j'avoue
    c'est un peu bizarre d'écrire :

    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
     
    public class LedThread extends Thread{
     
    	boolean isActif = false;
     
    	public LedThread(Object obj) {
    		ledTrace = (StatusLineLedNexusContributionItem)obj;
    	}
     
    	public void setActif(boolean actif){
    		isActif = actif;
    	}
     
     
            public void run() {
            while(isActif){			
            	if(pouet){
            		Display.getDefault().syncExec(new Runnable() {
            			public void run() {
            				action();
            			}
            		});
            	}
            }
    	}	
     
    }
    le doublement du run me pertube un peu ...

  13. #13
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Du coup, n'hésite pas à jeter un oeil au Job et UIJob.
    C'est mieux intégré au framework.
    Pas de questions technique par MP, les forums sont là pour ça.

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

Discussions similaires

  1. évènement appelé par un thread
    Par Jérémy Lefevre dans le forum wxWidgets
    Réponses: 4
    Dernier message: 20/10/2006, 17h47
  2. Comment modifier une BufferedImage alimenté par un Thread
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 02/08/2006, 15h04
  3. update d'un champs par le minimum d'une table liée
    Par tiopan dans le forum Access
    Réponses: 2
    Dernier message: 27/03/2006, 16h49
  4. [SWT]mise a jour ihm SWT par un thread
    Par will82 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 06/08/2004, 11h37
  5. Fichier ecrit par un Thread et lu par un autre Thread
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/04/2004, 14h56

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