Download Swing : timers et threads .PDF
3847448 Downloads
6.39 MB .pdf
Worker Thread GUI Update } process() Executed in EDT EIA-FR / Jacques Bapst EDT Event Dispatch Thread IHM1_11 20 Interface HommeHomme-Machine 1 / Swing : Timers & Threads SwingWorker Model [3] § La méthode doInBackground() peut également transmettre des informations de progression (entier 0. Interface Homme HommeMachine 1 Interface utilisateur graphique (GUI) 11 Swing : Timers & Threads Jacques Bapst [email protected] Interface HommeHomme-Machine 1 / Swing : Timers & Threads Utilisation de Threads avec Swing § La conception de la librairie Swing impose que les instructions qui accèdent et manipulent des composants de l'interface graphique soient effectuées dans un seul Thread. 6 du JDK, cette classe ne faisait pas partie de la plate-forme Java standard mais pouvait être téléchargée (site de Sun). EIA-FR / Jacques Bapst IHM1_11 17 Interface HommeHomme-Machine 1 / Swing : Timers & Threads SwingWorker Framework [3] § Les instructions de la méthode doInBackground() sont exécutées (dans un Thread indépendant) dès que la méthode execute() a été invoquée sur l'instance de SwingWorker. § Par exemple : • Si certaines instructions durent longtemps, elles ne devraient pas être insérées dans des Event Listener car elles bloqueront toute la gestion de l'interface graphique qui ne réagira plus aux sollicitations de l'utilisateur. net) § Voir API, documentation et exemples sur les sites correspondants. EIA-FR / Jacques Bapst IHM1_11 4 Interface HommeHomme-Machine 1 / Swing : Timers & Threads Event Dispatch Thread (EDT) § Le Event Dispatch Thread (EDT) est le Thread qui exécute les instructions de dessin (Drawing) des composants et qui se charge de la gestion des événements (Event Handling) liés à ces composants. getNewValue()); } } }); EIA-FR / Jacques Bapst IHM1_11 25 Interface HommeHomme-Machine 1 / Swing : Timers & Threads SwingWorker : Principe d'utilisation [5] § Le code de la méthode done() est exécuté après la fin de la méthode doInBackground() ou après invocation de la méthode cancel(). § Autrement dit, la librairie Swing n'est pas Thread-Safe (à l'exception de quelques rares méthodes mentionnées plus loin). § Dans certaines situations particulières on peut placer ces instructions dans un Runnable et les injecter dans le EDT avec invokeLater(). § Il est donc possible (même si Sun le déconseille maintenant) de créer les composants visuels, de les configurer et de les placer dans des conteneurs dans le cadre du Thread principal de l'application mais ensuite (après l'invocation de l'une des méthodes setVisible(true) ou pack()), toutes les instructions qui accèdent ou manipulent les composants Swing doivent être exécutées dans le EDT (sous peine d'effets imprévisibles). Elle est donc un peu plus complexe à utiliser correctement en relation avec une interface utilisateur. § La seule différence est que lors de son invocation, la méthode invokeAndWait() attend que les instructions de la méthode run() aient été exécutées dans le EDT avant de retourner le contrôle au code qui l'a invoquée. § Cette règle permet cependant, dans la plupart des cas, de construire l'interface graphique dans le Thread principal avant de la rendre visible. • Les composants de l'interface graphique ne doivent être accédés que depuis le EDT. } } EIA-FR / Jacques Bapst IHM1_11 22 Interface HommeHomme-Machine 1 / Swing : Timers & Threads SwingWorker : Principe d'utilisation [2] § Exemple de tâche à exécuter dans un Thread séparé //-// doInBackground() - Code executed in a separated thread //-protected Double doInBackground() throws Exception { double result = 0; //- Long task for (long i=1; i<nbSteps; i=i+2) { result += 1. EIA-FR / Jacques Bapst IHM1_11 15 Interface HommeHomme-Machine 1 / Swing : Timers & Threads SwingWorker Framework [1] § Pour simplifier la gestion des applications qui comportent des activités dont la durée est indéterminée et qui affectent l'état de l'interface utilisateur, une classe utilitaire appelée SwingWorker est à disposition. § Attention : L'instance de SwingWorker ne peut pas être réutilisée. sleep(500); // Can throw InterruptedException } } catch (InterruptedException e) { updateCounter(0); return "Interrupted"; } return "All done"; } EIA-FR / Jacques Bapst IHM1_11 28 Interface HommeHomme-Machine 1 / Swing : Timers & Threads SwingWorker et activités GUI § Si la méthode doInBackground() doit effectuer des actions liées à l'interface utilisateur (une mise à jour par exemple) il faut impérativement que ces instructions s'exécutent dans le EDT. § Des mises à jour intermédiaires de l'interface graphique peuvent être effectuées en invoquant la méthode publish() dans la méthode doInBackground() et en récupérant les résultats dans la méthode process() (qui s'exécute dans le EDT)