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?

Hi Adrian,
I don't understand exactly what you mean.

Not asking users during the calculations at all or just the yes/no?

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