Hi Lukas,
        Very cool.  Let us know if you have other problems!

~Roger

-----Original Message-----
From: Lukáš Macháček [mailto:[email protected]] 
Sent: Monday, January 16, 2012 12:57 PM
To: [email protected]; [email protected]
Subject: Re: 2.0.1 release and threads

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