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

SWT/JFace Java Discussion :

[SWT] Redraw de composant SWT depuis un thread non SWT


Sujet :

SWT/JFace Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 9
    Par défaut [SWT] Redraw de composant SWT depuis un thread non SWT
    Bonjour à tous,

    J'ai un petit soucis sur comment rafraichir un composant de mon appli SWT de façon convenable.
    Mon application est séparé en 2 packages : un "moteur" et un "GUI", le package GUI faisant appel à des fonctions du moteur, mais pas l'inverse.
    Or mon moteur réagit à certains éléments extérieurs (par exemple un changement sur un fichier), mais je ne vois pas comment communiquer l'info à la partie graphique pour que celle ci redessine les composants associés (appeler un redraw depuis le moteur ? bof :-/)

    Comment ce genre de probleme se resout en general ? En mettant du code dans le while contenant le readAndDispatch ?

    Merci de votre aide.
    S'il y a des points pas clair ... hésitez pas à le signaler

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Bonjour,

    Alors il y a une particularité dans SWT : l'affichage des composants SWT se fait dans un thread unique. Si un thead extérieur veut mettre un jour un widget directement,
    comme là :

    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
     
            new Thread() {
     
                /**
                 * @see java.lang.Thread#run()
                 */
                @Override
                public void run() {
                    int i = 0;
                    while (true) {
                        label.setText("Compteur :" + i);
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                        }
                        i++;
                    }
                }
     
     
            }.start();

    Tu auras une erreur : org.eclipse.swt.SWTException: Invalid thread access

    Pour qu'un processus externe mette à jour l'interface graphique, il faut utiliser les méthodes syncExec et asyncExec de l'objet Display :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    display.syncExec(
      new Runnable() {
        public void run(){
          label.setText(text);
        }
      });
    J'ai déjà eu affaire à une situation pareille, et voici notre solution :

    - Le "moteur" était un singleton.
    - A ce moteur on pouvait ajouter des listeners qui réagissait aux événements
    - Dans le code de l'IHM, on ajoutait au moteur des listeners qui mettait à jour les fenêtres en utilisant asyncExec et syncExec.

    J'espère t'avoir aidé,

    Laurent

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 9
    Par défaut
    Effectivement, la seule solution est le passage par syncExec et asyncExec.
    Après, il y a 2 solutions pour s'en servir :
    - Creer un TimerTask dans l'IHM qui demande un rafraichissement de la fenetre toutes les x ms. On est obligé de passer par la methode (a)syncExec vu que le timer est un thread a part. Bon cette solution est pas très ressource compliant :p
    - Que l'IHM implemente un listener qui sera appelé à chaque fois que le moteur lance un evenement. C'est la solution que tu as donné si j'ai bien compris, et c'est celle qui me convient le mieux je pense

    Merci pour ton aide.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Oui, aucun doute, la solution 2 est la meilleure à mon avis.

    Pense à mettre la discussion en "résolu" si tu penses que c'est le cas.

    A bientôt

    Laurent

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

Discussions similaires

  1. [SWT] Thread et SWT
    Par mehdi.kiwi dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 11/03/2009, 17h42
  2. Problème timer thread et swt
    Par kitue dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 07/06/2008, 12h22
  3. [SWT] centrer les composants dans une vue
    Par LoloBebop dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 07/06/2006, 10h34
  4. Réponses: 4
    Dernier message: 07/12/2005, 00h05

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