Hi Roger,

Thank you for your quick response. I understand what do you mean about
using TaskAdapter. You are right, it wasn't clean to do GUI changes out
of EDT. I tried to rewrite fist Task of all now and it works well. So
this is solved. And tomorrow i will start to rewrite the rest of my Task
implementations ;-)

And problem with my custom log4j Appender implementation I solved by
using of ApplicationContext.queueCallback, because threads are there
created by other parties ...

Thank you Roger very much for your tips!

Lukas



El 16/01/12 19:39, Roger L. Whitcomb escribió:
 Hi Lukas,
        That approach is still valid (and encouraged) EXCEPT that all updates to the UI 
MUST happen in the Event Dispatch Thread (or 'EDT').  This is now enforced in 2.0.1 (as 
you can see).  This is inherent, not only in Pivot, but all other GUI frameworks (that I 
know of).  So, even though it "appeared" to work fine with 2.0, there are/were 
subtle problems that you just didn't see yet.
        What you need to do is use either a TaskAdapter class or call the 
ApplicationContext.queueCallback() method to schedule your UI updates in the 
EDT, rather than doing them directly in the background thread.  For an example 
you can look at the Tutorial here: 
http://pivot.apache.org/tutorials/background-tasks.html.  I can step you 
through your code in more detail if you need more help.  Our application also 
has a number of places where we have needed to do this.
        I'm going to transfer this to the User list since this is not a 
developer issue, per se, since it is not a bug.  It is, however, something that 
has definitely changed (for the better) in 2.0.1.
        Thank you for using Pivot, though!!

 ~Roger

 -----Original Message-----
 From: Lukáš Macháček [mailto:[email protected]]
 Sent: Monday, January 16, 2012 8:17 AM
 To: [email protected]
 Subject: 2.0.1 release and threads

 Hi all,

 I am now testing coming 2.0.1 release of Pivot libraries with my desktop
 application developed during previous year on Pivot 2.0 and am facing
 one great problem with threads :-(

 Every task which loads data at background and worked in 2.0 well now
 throws exception like this:

 java.lang.IllegalStateException: this method can only be called from the
 AWT event dispatch thread, and not from "Thread-26"
       at org.apache.pivot.wtk.Container$1.check(Container.java:872)
       at
 org.apache.pivot.wtk.Container.assertEventDispatchThread(Container.java:880)
       at org.apache.pivot.wtk.Component.repaint(Component.java:2047)
       at org.apache.pivot.wtk.Component.repaint(Component.java:1998)
       at
 
org.apache.pivot.wtk.skin.ComponentSkin.repaintComponent(ComponentSkin.java:351)
       at
 
org.apache.pivot.wtk.skin.ComponentSkin.repaintComponent(ComponentSkin.java:346)
       at
 
org.apache.pivot.wtk.skin.terra.TerraTableViewSkin.enabledChanged(TerraTableViewSkin.java:1394)
       at
 
org.apache.pivot.wtk.Component$ComponentStateListenerList.enabledChanged(Component.java:399)
       at org.apache.pivot.wtk.Component.setEnabled(Component.java:2173)
       at cz.cgrim.alchemist.dql.RunQueryTask.execute(RunQueryTask.java:58)
       at cz.cgrim.alchemist.dql.RunQueryTask.execute(RunQueryTask.java:23)
       at
 org.apache.pivot.util.concurrent.Task$ExecuteCallback.run(Task.java:42)
       at
 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
       at java.util.concurrent.FutureTask.run(FutureTask.java:166)
       at java.lang.Thread.run(Thread.java:722)

 In this example at first it disables TableView (to disable user
 interaction during background load of data), than it loaded results from
 DQL query into that TableView and at the end it enabled that TableView.

 I have tens of use cases with similar approach in my application used to
 load data at background because it can take long time to finish while
 user can work on another tasks.

 Another equal problem with thread has occurred for example in my custom
 Log4J Appender:

 Exception in thread "Timer-2" java.lang.IllegalStateException: this
 method can only be called from the AWT event dispatch thread, and not
 from "Timer-2"
       at org.apache.pivot.wtk.Container$1.check(Container.java:872)
       at
 org.apache.pivot.wtk.Container.assertEventDispatchThread(Container.java:880)
       at org.apache.pivot.wtk.Component.invalidate(Component.java:1955)
       at
 
org.apache.pivot.wtk.skin.ComponentSkin.invalidateComponent(ComponentSkin.java:340)
       at
 
org.apache.pivot.wtk.skin.TextAreaSkinParagraphView.textRemoved(TextAreaSkinParagraphView.java:419)
       at
 
org.apache.pivot.wtk.TextArea$Paragraph$ParagraphListenerList.textRemoved(TextArea.java:55)
       at
 org.apache.pivot.wtk.TextArea$Paragraph.removeText(TextArea.java:153)
       at org.apache.pivot.wtk.TextArea.insertText(TextArea.java:757)
       at org.apache.pivot.wtk.TextArea.insertText(TextArea.java:730)
       at
 cz.cgrim.alchemist.logger.TextAreaAppender.append(TextAreaAppender.java:41)
       at
 org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
       at
 
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
       at org.apache.log4j.Category.callAppenders(Category.java:206)
       at org.apache.log4j.Category.forcedLog(Category.java:391)
       at org.apache.log4j.Category.log(Category.java:856)
       at com.documentum.fc.common.DfLogger.warn(DfLogger.java:151)
       at
 
com.documentum.fc.client.impl.bof.cache.ClassCacheManager$CacheCleanupTask.run(ClassCacheManager.java:602)
       at java.util.TimerThread.mainLoop(Timer.java:555)
       at java.util.TimerThread.run(Timer.java:505)

 Here I simply implement AppenderSkeleton and append every line from
 LoggingEvent into Pivot's TextPane. Log4J runs it in separate thread.

 Please, is now there another approach how to use threads and Pivot's
 Task to do changes in GUI or is it a bug? In 2.0 release everything
 spoken here worked like a charm.

 Thanks for an advance.
 Lukas Machacek


Reply via email to