java  

Re: Swing et threads

Guillaume Desnoix
Wed, 27 Nov 2002 08:53:13 -0800

Aurelien Mazurie:
Wow ! Ca marche maintenant =)
Par contre je n'arrive pas à comprendre pourquoi, ni où était l'erreur.
Ce que j'ai maintenant, c'est un thread appellé après la création des objets Swing, qui contient des instructions pour injecter des données dans ces objets, + une instruction invokeLater() qui appelle... un autre thread (un Runnable) qui injecte les données les plus grosses (celles destinées au JTable). Bizarre ?
Ok.

Certes mais il n'est jamais demarre ;-(

Pourquoi n'est-il jamais démarré ?
Parce que sa methode start() n'etait pas appele.
Pourtant il l'est bien à un moment ou à un autre puisque les données finissent par être chargées, et sont affichées dans les composants Swing.
Non, tu executes sa methode run() mais celle-ci s'execute dans le thread courant (a savoir AwtEventDispatchThread).

En fait il faut faire:
  new ManageObj(dataObj).start();

Ok, ca c'est donc fait juste après avoir créé les composants Swing.
Disons au moment ou tu veux commencer a recuperer les donnees. Ca peut aussi etre apres display().

et dans la méthode run():
  for each data
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run() { add_to_frame(data); }
    });

Et donc là, à l'intérieur du Thread, j'implémente un Runnable ?? Pour chacune des données à injecter en plus ?
Oui. Ou bien tu reutilises le meme en le parametrant.

Que ce passe-t'il pour les instructions contenues dans le Thread (et non pas dans le Runnable qui y est inclu), et qui elles aussi injectent dans les composants Swing (de toutes petites quantités de données, cependant) ?
Elles ne devraient pas toucher aux composants Swing (car elles ne sont pas dans le bon thread). Deplace les dans un Runnable pour eviter tout risque de deadlock.

En résumé, le Thread est-il réellement utile ?
Oui
Ne peut-on pas appeller, juste après avoir créé les composants Swing, directement des Runnable grâce à invokeLater() ?
Si, a condition que ce soit rapide. Mais en general, il faut mieux faire un thread separe (et en plus avec une priorite inferieure).

Ou le Thread qui les enveloppe a-t'il une fonction au niveau de la event queue qui assure que ces Runnable seront bien executés ?
Non. Le thread s'execute independament de la EQ mais y ajoute simplement des ActiveEvents(Runnable).

Normal  puisque tu bloques le thread (avec la tache ManageObj).

? Je ne comprends pas. Pourquoi mon thread initial (c'est à dire, justement ManageObj()) est-il bloqué ?
Je me suis mal exprime. Je voulais dire que le AwtEventDispatchThread est en train d'executer la methode run() de ManageObj (alors que cette methode devrait etre execute par ManageObj lui meme).

Remarque, il semble bien
que je n'ai pas la main à ce moment... Mmm...
Si tu n'as pas la main, c'est que tu es dans le AwtEventDispatchThread et que tu as donc le meme probleme (simplement il doit y avoir un composant qui demande un repaint immediat qq part).

Guillaume