Toon posts:

[Java] Thread en Swing

Pagina: 1
Acties:

Verwijderd

Topicstarter
Middag,

Vraagje,

Ik probeer een progress bar te implementeren voor als ik een bestand naar schijf probeer te schrijven.

In de schrijf routine van de applicatie hou ik een teller bij welke ik doorstuur naar de progressbar.

Alles leuk en aardig, maar het verkeer naar de schijf is een beetje hoog, en de proc belasting ook.

Resultaat : GUI bevriest totdat ik klaar ben met schrijven

Alles draait in 1 thread. (of draait Swing zelf in een aparte thread??? Dat zou namelijk een hoop verklaren)

Is er een mogelijkheid om de user interface te dwingen om zich te tekenen en dan pas weer verder gaan met schrijven?


Komt misschien een beetje overeen met:

[topic=200651/1/25]

Verwijderd

Topicstarter
Op woensdag 08 augustus 2001 15:29 schreef mbravenboer het volgende:
Inderdaad is Swing single threaded. Als je met meerdere threads gaat werken moet je er daarom voor zorgen dat alle aanpassingen die je maakt aan de GUI via de evendispatch thread uitvoert. Hiervoor moet je de request even inpakken en in Runnable en op de even-dispatch thread plaatsen via SwingUtilities.invokeLater(Runnable).

Hier kan je er meer over lezen:
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
laatste is me alleen niet helemaal duidelijk.....request inpakken en in Runnable op de even-dispatch thread plaatsen via SwingUtilities.invokeLater(Runnable).

  • DusHmaniac
  • Registratie: Oktober 2001
  • Laatst online: 07-09-2022

DusHmaniac

Boe!

Wat is je hieraan niet duidelijk?? Staat er toch best duidelijk hoor :)

All your base are belong to Chuck Norris


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alles wat met de user-interface van Swing te maken heeft wordt op 1 thread uitgevoerd. Deze event-dispatch thread zorgt ervoor dat EventListeners van alle Swing componenten worden aangeroepen. De componenten zelf plaatsen in feite alleen maar berichten op deze event-dispatch thread dat ze een EventListener aan willen roepen.

Als je op deze event-dispatch thread een lange operatie gaat uitvoeren blokkeert de volledige GUI. Dit komt simpelweg omdat er dan geen nieuwe events meer uitgevoerd zullen worden zolang jij met die lange operatie bezig bent.

Als je dus 'veel' moet doen, moet je dit op een apart thread doen en niet op de event-dispatch thread. Je moet dus de operatie niet direct gaan uitvoeren vanuit de methode waar je een event binnen krijgt.

Als je dit gaat doen moet je gaan uitkijken: je bent dan multi-threaded aan het werken. Alle operaties op Swing componenten moeten echter vanaf de event-dispatch thread gebeuren. Als je dus vanaf een andere thread iets met je GUI wilt doen (zoals je ProgressBar updaten) moet je een Runnable op de event-dispatch thread plaatsen via de methode invokeLater.

Duidelijk? :) .

Zie voor veel meer goede info deze artikelen van de Swing Connection en de Java Tutorial:

http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op woensdag 13 februari 2002 15:25 schreef DusHmaniac het volgende:
Wat is je hieraan niet duidelijk?? Staat er toch best duidelijk hoor :)
Zal komen omdat ik het niet helemaal begrijp :-(

Heb nu een aparte thread aangemaakt waar een aparte GUI in aanwezig is. Als ik een message uit een andere thread stuur en de thread daarna laat slapen, word de GUI nog steeds niet geupdate

Maar ben nu door de thread tutorials aan het gaan, want die dingen zijn me gewoon niet helemaal duidelijk

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
mr.beidehand: Heb nu een aparte thread aangemaakt waar een aparte GUI in aanwezig is.
Een thread met een GUI? Dat klinkt obscuur ;) . Lees het stukje wat ik hierboven schrijf nog eens goed door. Het vat eigenlijk de artikelen die ik noem samen. Het is sowieso zeer leerzaam om die even goed door te nemen. Het zijn wel leuke stukjes vind ik :) .
Als ik een message uit een andere thread stuur en de thread daarna laat slapen, word de GUI nog steeds niet geupdate.
Je hoeft je operatie helemaal niet te laten slapen. Dat zou ook zonde zijn. Je moet gewoon even goed bekijken hoe je aanpassingen op de GUI via de event-dispatch thread moet doorgeven aan de GUI :) . Daarna gaat alles goed.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Zucht....heerlijk......

Heren, dank u, het werkt....

Gewoon een aparte thread aangemaakt die de schrijf functie uitvoerd....

SIM-PEL
Pagina: 1