From: DOUTCH GARETH-G. <Gar...@mo...> - 2008-02-07 18:18:56
|
Hi, Want to dispatch a long running process from a JButton and while it is running: * release the JButton from it's depressed state * update my UI into a 'busy / wait' state until the process finishes when I will return my UI into it's normal state. But there's something basic that I am missing here, can anyone help? Regards, Gareth Samples of my have attempts: class SomePanel(swing.JPanel) def buildUI(self): self.add(swing.JButton('Update', actionPerformed=self.update)) def update(self, event): import threading self.safety(True) # disable the ui from further inputs t = threading.Thread(target=long_running_process) t.start() t.join() self.refresh() # update with fresh info from the process self.safety(False) # restore user inputs and def update(self, event): self.safety(True) # disable the ui from further inputs long_running_process() self.refresh() # update with fresh info from the process self.safety(False) # restore user inputs |
From: Jeff E. <jem...@fr...> - 2008-02-07 18:22:38
|
join() blocks until the thread completes. DOUTCH GARETH-GDO003 wrote: > Hi, > > Want to dispatch a long running process from a JButton and while it is > running: > * release the JButton from it's depressed state > * update my UI into a 'busy / wait' state > until the process finishes when I will return my UI into it's normal > state. > > But there's something basic that I am missing here, can anyone help? > > Regards, > Gareth > > > Samples of my have attempts: > > class SomePanel(swing.JPanel) > def buildUI(self): > self.add(swing.JButton('Update', actionPerformed=self.update)) > > def update(self, event): > import threading > self.safety(True) # disable the ui from further inputs > t = threading.Thread(target=long_running_process) > t.start() > t.join() > self.refresh() # update with fresh info from the process > > self.safety(False) # restore user inputs > > > and > > def update(self, event): > self.safety(True) # disable the ui from further inputs > long_running_process() > self.refresh() # update with fresh info from the process > > self.safety(False) # restore user inputs > > > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > > ------------------------------------------------------------------------ > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |
From: DOUTCH GARETH-G. <Gar...@mo...> - 2008-02-08 09:56:10
|
Many thanks to all who replied. This comment by Jeff Emanuel was the clue that I needed. In the end the fix looked like this: class SomePanel(swing.JPanel) def buildUI(self): self.add(swing.JButton('Update', actionPerformed=self.update)) def update(self, event): import threading t = threading.Thread(target=self.__update) t.start() def __update(self): self.safety(True) # disable the ui from further inputs long_running_process() # run the long process self.refresh() # update with fresh info from the process self.safety(False) # re-able the ui for further inputs And that works! Regards, Gareth -----Original Message----- From: Jeff Emanuel [mailto:jem...@fr...] Sent: 07 February 2008 18:22 To: DOUTCH GARETH-GDO003 Cc: jyt...@li... Subject: Re: [Jython-users] Swing JButton dispatch long processes on thread? join() blocks until the thread completes. DOUTCH GARETH-GDO003 wrote: > Hi, > > Want to dispatch a long running process from a JButton and while it is > running: > * release the JButton from it's depressed state > * update my UI into a 'busy / wait' state until the process finishes > when I will return my UI into it's normal state. > > But there's something basic that I am missing here, can anyone help? > > Regards, > Gareth > > > Samples of my have attempts: > > class SomePanel(swing.JPanel) > def buildUI(self): > self.add(swing.JButton('Update', actionPerformed=self.update)) > > def update(self, event): > import threading > self.safety(True) # disable the ui from further inputs > t = threading.Thread(target=long_running_process) > t.start() > t.join() > self.refresh() # update with fresh info from the process > > self.safety(False) # restore user inputs > > > and > > def update(self, event): > self.safety(True) # disable the ui from further inputs > long_running_process() > self.refresh() # update with fresh info from the process > > self.safety(False) # restore user inputs > > > > > ---------------------------------------------------------------------- > -- > > ---------------------------------------------------------------------- > --- This SF.net email is sponsored by: Microsoft Defy all challenges. > Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > > ---------------------------------------------------------------------- > -- > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |
From: Jeff E. <jem...@fr...> - 2008-02-08 16:46:25
|
Beware that updating the GUI from a thread other than the event thread can fail or cause corruption. You may need to do self.refresh() in asyncExec. DOUTCH GARETH-GDO003 wrote: > Many thanks to all who replied. > This comment by Jeff Emanuel was the clue that I needed. > In the end the fix looked like this: > > class SomePanel(swing.JPanel) > def buildUI(self): > self.add(swing.JButton('Update', actionPerformed=self.update)) > > def update(self, event): > import threading > t = threading.Thread(target=self.__update) > t.start() > > def __update(self): > self.safety(True) # disable the ui from further inputs > long_running_process() # run the long process > self.refresh() # update with fresh info from the > process > self.safety(False) # re-able the ui for further inputs > > And that works! > > Regards, > Gareth > > > > -----Original Message----- > From: Jeff Emanuel [mailto:jem...@fr...] > Sent: 07 February 2008 18:22 > To: DOUTCH GARETH-GDO003 > Cc: jyt...@li... > Subject: Re: [Jython-users] Swing JButton dispatch long processes on > thread? > > join() blocks until the thread completes. > > DOUTCH GARETH-GDO003 wrote: >> Hi, >> >> Want to dispatch a long running process from a JButton and while it is >> running: >> * release the JButton from it's depressed state >> * update my UI into a 'busy / wait' state until the process finishes >> when I will return my UI into it's normal state. >> >> But there's something basic that I am missing here, can anyone help? >> >> Regards, >> Gareth >> >> >> Samples of my have attempts: >> >> class SomePanel(swing.JPanel) >> def buildUI(self): >> self.add(swing.JButton('Update', actionPerformed=self.update)) >> >> def update(self, event): >> import threading >> self.safety(True) # disable the ui from further inputs >> t = threading.Thread(target=long_running_process) >> t.start() >> t.join() >> self.refresh() # update with fresh info from the process >> >> self.safety(False) # restore user inputs >> >> >> and >> >> def update(self, event): >> self.safety(True) # disable the ui from further inputs >> long_running_process() >> self.refresh() # update with fresh info from the process >> >> self.safety(False) # restore user inputs >> >> >> >> >> ---------------------------------------------------------------------- >> -- >> >> ---------------------------------------------------------------------- >> --- This SF.net email is sponsored by: Microsoft Defy all challenges. >> Microsoft(R) Visual Studio 2008. >> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >> >> >> ---------------------------------------------------------------------- >> -- >> >> _______________________________________________ >> Jython-users mailing list >> Jyt...@li... >> https://lists.sourceforge.net/lists/listinfo/jython-users > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |
From: Jeff E. <jem...@fr...> - 2008-02-08 16:48:01
|
Oops, asyncExec is a function from another GUI toolkit. You want invokeLater. Jeff Emanuel wrote: > Beware that updating the GUI from a thread other than > the event thread can fail or cause corruption. You > may need to do self.refresh() in asyncExec. > > > DOUTCH GARETH-GDO003 wrote: >> Many thanks to all who replied. >> This comment by Jeff Emanuel was the clue that I needed. >> In the end the fix looked like this: >> >> class SomePanel(swing.JPanel) >> def buildUI(self): >> self.add(swing.JButton('Update', actionPerformed=self.update)) >> >> def update(self, event): >> import threading >> t = threading.Thread(target=self.__update) >> t.start() >> >> def __update(self): >> self.safety(True) # disable the ui from further inputs >> long_running_process() # run the long process >> self.refresh() # update with fresh info from the >> process >> self.safety(False) # re-able the ui for further inputs >> >> And that works! >> >> Regards, >> Gareth >> >> >> >> -----Original Message----- >> From: Jeff Emanuel [mailto:jem...@fr...] >> Sent: 07 February 2008 18:22 >> To: DOUTCH GARETH-GDO003 >> Cc: jyt...@li... >> Subject: Re: [Jython-users] Swing JButton dispatch long processes on >> thread? >> >> join() blocks until the thread completes. >> >> DOUTCH GARETH-GDO003 wrote: >>> Hi, >>> >>> Want to dispatch a long running process from a JButton and while it is >>> running: >>> * release the JButton from it's depressed state >>> * update my UI into a 'busy / wait' state until the process finishes >>> when I will return my UI into it's normal state. >>> >>> But there's something basic that I am missing here, can anyone help? >>> >>> Regards, >>> Gareth >>> >>> >>> Samples of my have attempts: >>> >>> class SomePanel(swing.JPanel) >>> def buildUI(self): >>> self.add(swing.JButton('Update', actionPerformed=self.update)) >>> >>> def update(self, event): >>> import threading >>> self.safety(True) # disable the ui from further inputs >>> t = threading.Thread(target=long_running_process) >>> t.start() >>> t.join() >>> self.refresh() # update with fresh info from the process >>> >>> self.safety(False) # restore user inputs >>> >>> >>> and >>> >>> def update(self, event): >>> self.safety(True) # disable the ui from further inputs >>> long_running_process() >>> self.refresh() # update with fresh info from the process >>> >>> self.safety(False) # restore user inputs >>> >>> >>> >>> >>> ---------------------------------------------------------------------- >>> -- >>> >>> ---------------------------------------------------------------------- >>> --- This SF.net email is sponsored by: Microsoft Defy all challenges. >>> Microsoft(R) Visual Studio 2008. >>> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >>> >>> >>> ---------------------------------------------------------------------- >>> -- >>> >>> _______________________________________________ >>> Jython-users mailing list >>> Jyt...@li... >>> https://lists.sourceforge.net/lists/listinfo/jython-users >> ------------------------------------------------------------------------- >> This SF.net email is sponsored by: Microsoft >> Defy all challenges. Microsoft(R) Visual Studio 2008. >> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >> _______________________________________________ >> Jython-users mailing list >> Jyt...@li... >> https://lists.sourceforge.net/lists/listinfo/jython-users > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |
From: James R E. <ea...@ba...> - 2008-02-07 18:44:10
Attachments:
smime.p7s
|
On Feb 7, 2008, at 13:18 , DOUTCH GARETH-GDO003 wrote: > Want to dispatch a long running process from a JButton and while it > is running: > * release the JButton from it's depressed state > * update my UI into a 'busy / wait' state > until the process finishes when I will return my UI into it's normal > state. Hi Gareth, You might want to take a look at the SwingWorker, which was designed specifically with this kind of purpose in mind. If you're using Java 6, it's part of the standard JRE. Otherwise, you can find it here: <https://swingworker.dev.java.net/ > or here: <http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html > (Note: the different versions have a different syntax.) Cheers! James -- With sufficient thrust, pigs fly just fine. -- RFC 1925, Fundamental Truths of Networking |
From: David H. <dav...@gm...> - 2008-02-07 19:18:52
|
On Feb 7, 2008 12:18 PM, DOUTCH GARETH-GDO003 <Gar...@mo...> wrote: > > > Hi, > > Want to dispatch a long running process from a JButton and while it is > running: > * release the JButton from it's depressed state > * update my UI into a 'busy / wait' state > until the process finishes when I will return my UI into it's normal state. > You need to accomplish four things: 1. Run the job. 2. Prevent the user from requesting any further actions until the job is done. 3. Keep the app responsive and give the user some indication that a job is running. (Otherwise, the user may simply kill the app.) 4. Let the user understand that his ability to perform actions, etc. will be restored momentarily when the job is done. (Otherwise, the user may kill the app.) This is really a question about Swing (and the application framework, if you're using one), so you'll get more complete and specific answers in a forum with that focus. But, for what it's worth from an SWT user, here's an outline of how to accomplish the four requirements: 1. Run the job in a worker thread. 2. Pop up a modal dialog in the event-dispatching thread. 3. Enable a "busy cursor" and/or show a progress monitor widget in the modal dialog. 4. Include a "Please wait while..." or "Executing task X..." message in the modal dialog. If you are serious about needing to lock users out of the application (which usually causes more problems than it solves, IMO -- but that's another topic), you will have to make sure they can't dismiss the modal dialog and can't interact with the windows behind it. Consult Swing resources (or the docs for your application framework) for more information. Good luck, - David |