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] synchro widget avec thread


Sujet :

SWT/JFace Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut [SWT] synchro widget avec thread
    Bonjour,

    j'ai un problème pour synchroniser le rafraichissement d'une Table avec un thread qui récupéré des données d'un port USB.

    le thread rempli un Byte[] inputBuffer en fonction des données qu'il reçoit.

    comment faire en sort que des que le inputBuffer.length est != 0 je lance un méthode de rafraichissement de mon Table qui soit synchroniser avec le display pour ne pas avoir la fameuse erreur "Invalid thread access"?

    Merci pour votre aide.
    TiTi.

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Points : 379
    Points
    379
    Par défaut
    Tu dois utiliser les méthodes d'une instance of Display suivantes :

    - syncExec(Runnable) : pour lancer le Runnable dans le thread du Display, la méthode rend la main au programme à la fin du run().

    - asyncExec(Runnable) : pour lancer le Runnable en "parallèle" du thread du Display, l'execution continue même si la méthode run() n'a pas fini.

    - timerExec(int, Runnable) : pour lancer le Runnable après que le temps donné en millisecondes se soit écoulé.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 159
    Points
    159
    Par défaut
    En fait cela provient du fait que Display sous SWT est déjà un thread d'où la fameuse erreur :

    Exception in thread "main" org.eclipse.swt.SWTException : Invalid Thread access

    Pour éviter cela il faut passer en 2 étapes

    Dans ton programme principal, tu créés une méthode AfficheInfo de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public void afficheInfo(String str){
    		class AfficheInfo implements Runnable{
    			String str="";
    			public AfficheInfo(String str){
    				this.str=str;
    			}
    			public void run() {
    				textStock.setText(str);
    			}
    		}
    		display.asyncExec(new AfficheInfo(str));
    	}

    Cette méthoed affiche la chaine str grace à la fonction display.asyncExec.

    Dans ton Thread.
    Tu rajoutes un appel à ta classe de départ par exemple MonAppli sous la forme


  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Points : 159
    Points
    159
    Par défaut Oups voila le message en entier
    En fait cela provient du fait que Display sous SWT est déjà un thread d'où la fameuse erreur :

    Exception in thread "main" org.eclipse.swt.SWTException : Invalid Thread access

    Pour éviter cela il faut passer en 2 étapes

    Dans ton programme principal, tu créés une méthode AfficheInfo de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public void afficheInfo(String str){
    		class AfficheInfo implements Runnable{
    			String str="";
    			public AfficheInfo(String str){
    				this.str=str;
    			}
    			public void run() {
    				textStock.setText(str);
    			}
    		}
    		display.asyncExec(new AfficheInfo(str));
    	}

    Cette méthoed affiche la chaine str grace à la fonction display.asyncExec.

    Dans ton Thread.
    Tu rajoutes un appel à ta classe de départ par exemple MaFenetre sous la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    private MaFenetre maFenetre = null;
    Puis dans le constructeur de ton Thread tu passes maFenetre.

    A partir de là tu as acces à la fonction AfficheInfo dans ton thread sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maFenetre.AfficheInfo("chaine d'info");
    L'affichage de fera dans la fenetre principale

    Bon courage

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Je suis pas sur de comprendre...
    je ne vois pas où placer les deux dérnières lignes.
    Ca ne serai pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFenetre.afficheInfo("chaine d'info");

    et "textStock" sort d'où?
    J'ai beau essayer ton code, le texte de mon Label ne change pas

    Si tu as un exemple complet d'un Thread qui modifie un Text je suis preneur

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    J'ai trouvé pourquoi cela ne fonctionnais pas, j'essayais de modifier le texte d'un Label, ce qui est apparemment impossible depuis un autre Thread, par contre quand j'ai changé le type de mon Label en Text, ca a marché

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    Bonjour,
    Merci pour vos réponses. Maintenant cela fonctionne très bien.

    Toutefois j'ai l'erreur suivant. lors que je quitte le programme:
    ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
    JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]


    il a t'il quelque chose que je n'ai pas fait correctement.
    Voici mon init:
    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
     
    		display = new Display();
    		shell = new Shell(display);
    		//centerOnScreen(display, shell);
     
    		terminal = new Terminal(shell);
     
    		shell.setText(About.WHAT() + " " + About.VERSION()); // windows title
    		shell.setLayout(new FillLayout());
     
    		CreateMenu();
    		shell.setMenuBar(menuBar);
     
    		shell.pack();
    		shell.open();
     
    		terminal.ClearInput();
     
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
     
    		}
     
    		terminal.Disconnect();
    		if (!shell.isDisposed())
    			shell.close();
    		if (!display.isDisposed())
    			display.dispose();

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 42
    Points
    42
    Par défaut
    Je viens de trouver la réponse:

    Il faut rajouter la ligne suivante à la fin du code précédent.

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

Discussions similaires

  1. [SWT]comptabilité entre SWT et Swing : avec eclipse
    Par lawale125 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 12/01/2007, 10h58
  2. [MFC] Cherche Timer avec thread
    Par romeo9423 dans le forum MFC
    Réponses: 17
    Dernier message: 09/03/2005, 10h33
  3. [SWT][Editeur] Probleme avec V4All
    Par hanane_iaai dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 06/02/2005, 09h17
  4. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45
  5. [Débutant] SWT: composant Texte avec \n
    Par bonnefr dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 18/05/2004, 11h44

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