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