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 :

Thread et objet


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut Thread et objet
    Bonjour

    J'ai un petit probleme avec un thread.
    J'ai crée un tableviewer dans mon thread principal, puis je lance un thread qui se connecte en tant que serveur.
    J'aimerais ajouter des tableItems dans mon tableViewer:

    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
    30
    31
    32
     
    public class DbgConsole extends ViewPart {
     
      public void createPartControl(Composite parent) {
        tableDisplay = new TableDisplay(parent);
     
        makeActions();
      }
     
      private void makeActions() {	
        actionStart = new Action(){
          public void run(){
    	TelnetServer telnetserver = new TelnetServer(23, tableDisplay, null);
    	telnetserver.start();
          }		
        };
      }
    }
     
    public class TelnetServer extends Thread {
      public TelnetServer(int port, TableDisplay tableDisplay, BufferedReader fin) {
        this.tableDisplay = tableDisplay;
      }
     
      public void run() {
        TableItem item1 = new TableItem(tableDispaly.getTable(), SWT.NONE);
        item1.setText(new String [] {"1", "test"}) ;
        // ...
        // pour chaque message recu sur le port, ajouter item
        // ...
      }
    }
    J'obtiens l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
    J'ai lu dans ce forum qu'il fallait utiliser, pour accèder à un "widget" SWT à partir d'un thread java,
    la méthode asyncexec de l'objet Display.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Display.getDefault().asyncExec(new Runnable() {
                   public void run() {
                          monChamp.setText("Le compteur vaut :" + cpt);
                   }
                }
    mais je n'ai pas compris ou l'utiliser.

    merci pour votre aide.

  2. #2
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Si tu utilise Java 1.6 je te conseille de proscrire les threads et d'implémenter la classe abstraite SwingWorker.

  3. #3
    Membre chevronné
    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
    Par défaut
    En SWT on utilise pas SwingWorker... La classe Display fournie des méthodes pour ces travaux.
    Regarde du côté des méthodes syncExec(Runnable), asyncExec(Runnable) et timerExec(int, Runnable) de la classe Display.

    Tu n'as pas le droit d'utiliser les composants SWT depuis un autre thread que celui qui a créé le Display.

  4. #4
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    merci Heimdal et soft0613 pour vos reponses,

    J'ai regardé du coté de la classe SwingWorker.
    Effectivement, j'arrive a afficher les lignes recus depuis mon serveur mais seulement dans un composant JTextArea et pas dans un composant SWT.

    Donc, si j'ai bien compris, soft0613, soit je garde SwingWorker et je n'utilise que des composant Swing,
    soit je garde mes composants SWT en utilisant syncExec... ?

    Je ne sais pas quelle solution est la meilleur ?

    Je veux juste creer un objet permettant d'afficher des lignes de texte,
    que je puisse formater par la suite (couleur, sauvegarder ...)
    d'ou l'idée d'avoit un thread qui fait l'acquisition des données dans un objet
    et le thread principal qui fait des actions sur cet objet en fonction des evenement (bouton save, bouton color...etc).

    Peut etre existe-t-il un voie plus facile ?

  5. #5
    Membre chevronné
    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
    Par défaut
    Tu veux créer un champs texte ? Tu peux utiliser les classes Text, StyledText ou Label selon test besoins, as-tu déjà regardé de ce côté.
    Sinon je pense que tu dois pouvoir t'en sortir avec un seul thread pour ton problème je ne comprend pas bien pourquoi tu veux paralléliser la tâche.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    Je veux creer une zone de texte ou afficher des string que je recupere d'un autre programme via un serveur telnet.
    Je doit pouvoir modifier ce texte grâce a des actions sur des boutons comme save (sauvez toutes les lignes), colorize (mettre en couleur toutes les string spécifiées présente dans le texte), open (ouvrir un fichier texte) tout en continuant à afficher les string qui arrivent.

    C'est pour ca que je pensais créer un objet Table,
    avec un thread qui ne s'occupe que d'ajouter un "objet" (une string ou autre chose) a la table,
    à chaque fois que une string est recu sur le serveur.
    Depuis le thread principal, je gere l'appui sur les boutons colorize, save ... et utilise l'objet table en consequence.

    Tous ceci dans un plugin eclipse, qui output ca dans une fenêtre type Error Log, Tasks ...

    J'ai donc utilisé l'aide de création de plugin et j'ai:
    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
     
    public class DbgConsole extends ViewPart {
      public void createPartControl(Composite parent) {
        // creation de la table
        tableDisplay = new TableDisplay(parent);
     
     
      private void makeActions() {
        actionStart = new Action(){
          public void run(){
            TelnetServer telnetserver = new TelnetServer(23, tableDisplay, null);
    	telnetserver.start();			
          }		
        };
      }
    }
    avec la class TelnetServeur

    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 TelnetServer extends Thread {
      public TelnetServer(int port, TableDisplay tableDisplay, BufferedReader fin) {
        this.port = port;
        this.fin = fin;
        this.tableDisplay = tableDisplay;
      }
      public void run() {
        // connect to serveur
        ...
        do
        {
          // get message
          // add message to table
        }
      }
    }
    Du coup j'ai le problème que je ne peut pas modifier un composant swt dans un thread !
    Mais en utilisant un StyledText ou autre chose, ca devrait marcher.
    Je ne sais pas ce que tu en penses, il y a peut une meilleur facon ?

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

Discussions similaires

  1. thread et objet
    Par zenetcalme dans le forum Threads & Processus
    Réponses: 15
    Dernier message: 03/06/2008, 13h46
  2. Threads et objet this
    Par opensource dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 21/04/2008, 14h30
  3. Serialisation, thread et objet modifiable
    Par yozart dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 25/05/2007, 10h26
  4. [Thread] Modifier objet static depuis thread
    Par orelero dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 19/04/2006, 17h09

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