Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [udig-devel] how to start threads with monitor?

On Mon, 2007-04-30 at 10:34 +0200, Andrea Antonello wrote:
> Hi Adrian,
> I don't understand exactly what you mean.
> 
> Not asking users during the calculations at all or just the yes/no?

phrasing the question as yes/no. Pick other names and skip the standard
SWT dialog. It's more work for us, we have to build a custom dialog, but
saves our users time and confusion. Actually we should probably build
our own equivalent of the yes/no dialog...

--adrian

> 
> I make you an example. I have a shapefile representing the a river. The
> user digitalized it very badly, so I'm not sure how to get the river to
> go from its highest point to it's lowest (immagining I have no elevation
> info). I extract all the coords, order them nicely and then, I have to
> ask the user if the direction is the right one.
> How to do that without a dialog window?
> 
> I'm very willing to talk about that if that can make usability better.
> Andrea
> 
> 
> 
> Adrian Custer probaly wrote:
> > On Sun, 2007-04-29 at 18:36 +0200, Andrea Antonello wrote:
> >> Two questions about the PlatformGIS.runInProgressDialog method:
> >> 1) if something goes wrong the method swallows the exception thrown in
> >> the code, saying they get logged, however the thread returns without
> >> saying anything about the error to the workbench. Why that?
> >> 2) Ok about decoupling gui and algorythm, but what if I need to ask a
> >> yes or no to the user 
> > 
> > PLEASE, Please, please: No yes/no questions.
> > I realize this is going to be hard with eclipse but we have found that
> > asking users in that way is BAD. 
> >         (1) It makes users read the question which slows everyone down
> >         (2) There are some situations where phrasing the question
> >         becomes very hard.
> > So please, come up with workflow terms (verbs) Act/Don't Act,
> > Calculate/Cancel or other pairs.
> > 
> > Please protect our users (i.e. me),
> > thanks,
> >   adrian
> > 
> >> as soon as something was calculated inside the
> >> algorythm? If I put inside the IRunnableWithProgress a dialog, at that
> >> point the method breaks (due to the hidden exception) and returns
> >> without saying anything. What if I would like to popup a warning dialog?
> >> Is there a way? In swing the invokelater gave that possibility, but how
> >> to do here?
> >>
> >> Andrea
> >>
> >>
> >>
> >>
> >> Jesse Eichar probaly wrote:
> >>> So I think you could just reorder things then:
> >>>
> >>> final Runnable openMessage = new Runnable(){
> >>> public void run(){
> >>>   MessageDialog dialog = new MessageDialog(new Shell(SWT.BORDER |
> >>>         SWT.DIALOG_TRIM),    "Warning", null, "Will I show up?",
> >>> MessageDialog.WARNING, new String[]{"Ok"}, 0);
> >>>                     dialog.open();
> >>>             }
> >>>   }
> >>> }
> >>>
> >>> Display.getDefault().asyncExec( openMessage );
> >>>
> >>> IRunnableWithProgress operation = new IRunnableWithProgress(){
> >>>
> >>> public void run( IProgressMonitor monitor ) throws
> >>>         InvocationTargetException, InterruptedException {
> >>>             monitor.beginTask("Message!!!", 100);
> >>>             // do operation.
> >>>       };
> >>>
> >>> PlatformGIS.runInProgressDialog( "Running my Operation", true, operation );
> >>>
> >>>
> >>> On Apr 26, 2007, at 11:56 PM, Andrea Antonello wrote:
> >>>
> >>>> alright, I'm not as good as I would like in describing things :)
> >>>> So here I go:
> >>>>
> >>>> I used the tool extention point to create an Action. This is a button in
> >>>> the toolbar that launches a dialog used to configure the module.
> >>>> So I click on the button and a fancy dialog appears. I set my variables
> >>>> and maps and push the start button. At that point I would like to have
> >>>> my whole gui not to be blocked, while the algorithm does its work.
> >>>> Also I would give feedback to the user about what is going on, so I need
> >>>> the monitor instance.
> >>>>
> >>>> Your example below has two problems;
> >>>> - it starts up a progress window while the user has to first fill in
> >>>> stuff in the dialog, so no work is done at that point (only after
> >>>> pushing start button on the dialog)
> >>>> - I do not have the monitor instance yet
> >>>>
> >>>>
> >>>> Andrea
> >>>>
> >>>>
> >>>> Jesse Eichar probaly wrote:
> >>>>> Hi Andrea.  I think we need more of your intentions.  So usually if you
> >>>>> are running with a progress monitor you are NOT in the Display thread so
> >>>>> you can't do any UI stuff, much like Swing.  Second that method has a
> >>>>> bug so the progress monitor is currently hidden.  I will fix that bug.
> >>>>>  For now use runInProgressDialog  So for your example you may want to
> >>>>> do:
> >>>>>
> >>>>> final Runnable openMessage = new Runnable(){
> >>>>> public void run(){
> >>>>> MessageDialog dialog = new MessageDialog(new Shell(SWT.BORDER |
> >>>>> SWT.DIALOG_TRIM),
> >>>>> "Warning", null, "Will I show up?",
> >>>>> MessageDialog.WARNING, new String[]{"Ok"}, 0);
> >>>>>                 dialog.open();
> >>>>>             }
> >>>>> }
> >>>>> }
> >>>>>
> >>>>> IRunnableWithProgress operation = new IRunnableWithProgress(){
> >>>>>
> >>>>>
> >>>>>
> >>>>> public void run( IProgressMonitor monitor ) throws
> >>>>> InvocationTargetException, InterruptedException {
> >>>>> monitor.beginTask("Message!!!", 100);
> >>>>>
> >>>>> Display.getDefault().asyncExec( openMessage );
> >>>>>
> >>>>>         };
> >>>>>
> >>>>>
> >>>>> runInProgressDialog( "Running my Operation", true, operation );
> >>>>>
> >>>>> Jesse
> >>>>>
> >>>>>
> >>>>> On Apr 26, 2007, at 2:43 PM, Andrea Antonello wrote:
> >>>>>
> >>>>>> Hi Jesse,
> >>>>>> I think I really miss a piece of the truth...
> >>>>>>
> >>>>>> Reduced to the minimum, I now only try to launch a messagedialog from
> >>>>>> within the run method of the  AbstractActionTool retrieved from the
> >>>>>> tools extention point. It is really few code:
> >>>>>>
> >>>>>> IRunnableWithProgress runner = new IRunnableWithProgress(){
> >>>>>>
> >>>>>> public void run( IProgressMonitor monitor ) throws
> >>>>>> InvocationTargetException, InterruptedException {
> >>>>>> monitor.beginTask("Message!!!", 100);
> >>>>>> MessageDialog dialog = new MessageDialog(new Shell(SWT.BORDER |
> >>>>>> SWT.DIALOG_TRIM),
> >>>>>> "Warning", null, "Will I show up?",
> >>>>>> MessageDialog.WARNING, new String[]{"Ok"}, 0);
> >>>>>>                 dialog.open();
> >>>>>>             }
> >>>>>>
> >>>>>>         };
> >>>>>>
> >>>>>> PlatformGIS.run(runner);
> >>>>>>
> >>>>>>
> >>>>>> This gives the usual error of invealid thread access. What is wrong
> >>>>>> here?
> >>>>>> If I use the runBlockingOperation method it is worse, nothing shows up.
> >>>>>>
> >>>>>> Any idea?
> >>>>>> Andrea
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> Jesse Eichar probaly wrote:
> >>>>>>> Hi,
> >>>>>>>
> >>>>>>> Display widgets can only be modified in the display thread.  Take a
> >>>>>>> look
> >>>>>>> at the methods is PlatformGIS for a bunch of help with regards to
> >>>>>>> threading.
> >>>>>>>
> >>>>>>> As mentioned Jobs start up a new thread and allow progress to be
> >>>>>>> monitored.  If you set the job's setUser( true ) then the progress
> >>>>>>> dialog will open.  Remember that you have to update UI components
> >>>>>>> in the
> >>>>>>> Display thread.  Display.asyncExec for example.
> >>>>>>>
> >>>>>>> Jesse
> >>>>>>>
> >>>>>>> On Apr 23, 2007, at 6:40 AM, Andrea Antonello wrote:
> >>>>>>>
> >>>>>>>> Thanks for your reply Zlatko,
> >>>>>>>> I tried also the Job way, but I get the same Invalid Thread Access
> >>>>>>>> exception:
> >>>>>>>>
> >>>>>>>> Job job = new Job("my job ") {
> >>>>>>>>      protected IStatus run(IProgressMonitor monitor) {
> >>>>>>>>            domyCodeWork()
> >>>>>>>>            return Status.OK_STATUS;
> >>>>>>>>         }
> >>>>>>>>      };
> >>>>>>>>
> >>>>>>>>   job.schedule();
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Also the code you modified below doesn't work with the same error...
> >>>>>>>>
> >>>>>>>> I'm really confused (and I'm rather new to RCP and SWT), sinced in my
> >>>>>>>> opinion it happens often that you launch a dialog and while the
> >>>>>>>> dialog
> >>>>>>>> is there you do some work, without freezing the interface. But I
> >>>>>>>> can't
> >>>>>>>> find working examples.
> >>>>>>>>
> >>>>>>>> In swing there was this SwingUtilities.invokelater that worked pretty
> >>>>>>>> well.
> >>>>>>>>
> >>>>>>>> I guess I 'm missing something of the deeper theory.
> >>>>>>>>
> >>>>>>>> Isn't there in udig an Action that does something like that?
> >>>>>>>>
> >>>>>>>> Andrea
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Zlatko Perenda probaly wrote:
> >>>>>>>>> Hi,
> >>>>>>>>>
> >>>>>>>>> I did some asking around, this is what a friend of mine came up
> >>>>>>>>> with....
> >>>>>>>>>
> >>>>>>>>> You have to implement a job, org.eclipse.core.runtime.jobs.Job . You
> >>>>>>>>> have
> >>>>>>>>> run(IprogressMonitor pm) there, where you implement the method and
> >>>>>>>>> change
> >>>>>>>>> whatever you want through pm. You can add listeners if you want
> >>>>>>>>> to do
> >>>>>>>>> something after the job is done.
> >>>>>>>>>
> >>>>>>>>> And your code from first post, reworked some
> >>>>>>>>>
> >>>>>>>>> Display display = Display.getCurrent();
> >>>>>>>>>             if (display == null)
> >>>>>>>>>             {
> >>>>>>>>>                 display = Display.getDefault();
> >>>>>>>>>             }
> >>>>>>>>>  display.asyncExec(new Runnableevent)
> >>>>>>>>>                     {
> >>>>>>>>>                         public void run()
> >>>>>>>>>                         {
> >>>>>>>>>>         IWorkbench wb = PlatformUI.getWorkbench();
> >>>>>>>>>>         IProgressService ps = wb.getProgressService();
> >>>>>>>>>>             ps.busyCursorWhile(new IRunnableWithProgress(){
> >>>>>>>>>>                 public void run( IProgressMonitor pm ) {
> >>>>>>>>>>                     doMyCodeWithMonitorActivity()
> >>>>>>>>>>                 }
> >>>>>>>>>>             });
> >>>>>>>>>>
> >>>>>>>>>      }
> >>>>>>>>>                     });
> >>>>>>>>>
> >>>>>>>>> I hope this helps....
> >>>>>>>>>
> >>>>>>>>> Zlatko.
> >>>>>>>>>
> >>>>>>>>> -----Original Message-----
> >>>>>>>>> From: Andrea Antonello [mailto:andrea.antonello@xxxxxxxxx]
> >>>>>>>>> Sent: Monday, April 23, 2007 2:42 PM
> >>>>>>>>> To: Zlatko Perenda
> >>>>>>>>> Cc: 'User-friendly Desktop Internet GIS'
> >>>>>>>>> Subject: Re: [udig-devel] how to start threads with monitor?
> >>>>>>>>>
> >>>>>>>>> Hi Zlatko,
> >>>>>>>>> that is indeed what I am doing to make it work for now (the
> >>>>>>>>> asyncExec I
> >>>>>>>>> mean), but that doesn't supply my the so much loved monitor...
> >>>>>>>>> Where do I get the monitor from?
> >>>>>>>>>
> >>>>>>>>> Thanks,
> >>>>>>>>> Andrea
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> Zlatko Perenda probaly wrote:
> >>>>>>>>>> Hm, seems like you are accesing UI thread, from another....
> >>>>>>>>>>
> >>>>>>>>>> Try Display.asyncExec(runnable), and let runnable do the neccesary
> >>>>>>>>>> work. I
> >>>>>>>>>> think this should work.
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> -----Original Message-----
> >>>>>>>>>> From: udig-devel-bounces@xxxxxxxxxxxxxxxxxxxxx
> >>>>>>>>>> <mailto:udig-devel-bounces@xxxxxxxxxxxxxxxxxxxxx>
> >>>>>>>>>> [mailto:udig-devel-bounces@xxxxxxxxxxxxxxxxxxxxx] On Behalf Of
> >>>>>>>>>> Andrea
> >>>>>>>>>> Antonello
> >>>>>>>>>> Sent: Monday, April 23, 2007 2:25 PM
> >>>>>>>>>> To: User-friendly Desktop Internet GIS
> >>>>>>>>>> Subject: [udig-devel] how to start threads with monitor?
> >>>>>>>>>>
> >>>>>>>>>> I know this is more a rcp question than  a udig, but I'm not
> >>>>>>>>>> able to
> >>>>>>>>>> add
> >>>>>>>>>> progress tracking to my actions.
> >>>>>>>>>> The tool extention point doesn't supply a monitor and whenever I
> >>>>>>>>>> try
> >>>>>>>>>> somethin g like:
> >>>>>>>>>>         IWorkbench wb = PlatformUI.getWorkbench();
> >>>>>>>>>>         IProgressService ps = wb.getProgressService();
> >>>>>>>>>>
> >>>>>>>>>>             ps.busyCursorWhile(new IRunnableWithProgress(){
> >>>>>>>>>>                 public void run( IProgressMonitor pm ) {
> >>>>>>>>>>
> >>>>>>>>>>                     doMyCodeWithMonitorActivity()
> >>>>>>>>>>                 }
> >>>>>>>>>>             });
> >>>>>>>>>> I get an Invalid thread access exception.
> >>>>>>>>>>
> >>>>>>>>>> Any hint?
> >>>>>>>>>> Thanks in advance,
> >>>>>>>>>> Andrea
> >>>>>>>>>> _______________________________________________
> >>>>>>>>>> User-friendly Desktop Internet GIS (uDig)
> >>>>>>>>>> http://udig.refractions.net
> >>>>>>>>>> http://lists.refractions.net/mailman/listinfo/udig-devel
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>> _______________________________________________
> >>>>>>>> User-friendly Desktop Internet GIS (uDig)
> >>>>>>>> http://udig.refractions.net
> >>>>>>>> http://lists.refractions.net/mailman/listinfo/udig-devel
> >>>>>>>
> >>>
> >> _______________________________________________
> >> User-friendly Desktop Internet GIS (uDig)
> >> http://udig.refractions.net
> >> http://lists.refractions.net/mailman/listinfo/udig-devel
> > 
> > 



Back to the top