Jeff,

is it safe to say the skeleton of your method looks like this?

void execute() {
  // 1
  DeferredCommand.addCommand(new IncrementalCommand() { /* state machine
logic as posted above */ }
  // 2
}

The problem is, DeferredCommand isn't blocking, so after
DeferredCommand.addCommand(...), whatever logic you put inside the
incremental command won't be executed before the outer execute method
finishes. e.g., if I put System.out.println("execute() started") at //1
position and println("execute() finished") at //2 and loads of print()
inside the incremental command, the output will be:
  execute() started
  execute() finished
  // whatever I put in the incremental command
Therefore, execute() method isn't blocking.

I think I need to clarify/reiterate what I need: I have a list of async
commands, and I want execute() method to execute these commands, either in
serial or parallel, and execute() method waits until all these commands
finish and then returns.



On Thu, Aug 12, 2010 at 6:24 PM, Jeff Chimene <[email protected]> wrote:

> On 08/12/2010 02:23 PM, Kevin Qiu wrote:
> > Thanks for taking the time. Although it's not clear what action you put
> > in the timer and what the timer is supposed to do
>
> It's a "processing occurring" timer. I think I mentioned it earlier, so
> I didn't remove it from the example.
>
> > (IncrementalCommand is executed by DeferredCommand.CommandExecutor
> > and it already has a timer with timeslice set to 100ms).
>
> Right.
>
> > Also, I suppose you need to reset the "busy" flag in the callback of
> > the asynchronous calls.
>
> Yes. You already had that bit sussed. The case statement asynchronously
> drains the command queue, while providing a structure that synchronously
> resolves to a "final" command step.
>
> > I'm still a bit incredulous but I'll give it a try. Thanks again :)
>
> Feel free to ask.
>
> >
> > Cheers,
> >
> > On Thu, Aug 12, 2010 at 4:43 PM, Jeff Chimene <[email protected]
> > <mailto:[email protected]>> wrote:
> >
> >     On 08/12/2010 12:50 PM, Kevin Qiu wrote:
> >     > After some thought, I don't think putting it in IncrementalCommand
> and
> >     > execute with DeferredCommand help much here. Jeff, If I understand
> you
> >     > correctly, my execute method will look like this:
> >     >
> >     > class Executor {
> >     >   // declaration of list of commands
> >     >   void execute() {
> >     >     DeferredCommand.addCommand(new IncrementalCommand() {
> >     >       boolean executing;
> >     >       int currentIdx;
> >     >
> >     >       public boolean execute() {
> >     >         if (executing) return true;  // executor will keep looping
> >     >         // it's my turn now
> >     >         executing = true;
> >     >         AsyncCommand cmd = commands.get(currentIdx);
> >     >         cmd.execute(new AsyncCallback() {
> >     >           public void onFailure(Throwable e) { onSuccess(null); }
> >     >           public void onSuccess(Object o) {
> >     >             executing = false;
> >     >             ++currentIdx;
> >     >           }
> >     >       }
> >     >       // return point
> >     >   }
> >     > }
> >     >
> >     > The above method is actually still non-blocking. There's no
> guarantee
> >     > that my incremental command will finish executing before I reach
> >     > //return point. Did I miss anything?
> >
> >     Looking at your code a bit more closely (and while composing an
> >     example), I see that you want something that requires a bit more
> >     structure.
> >
> >     You have the IncrementalCommand() correctly implemented. Forget my
> >     previous answer.
> >
> >     Now that I really understand what you're asking (I think)...
> >
> >     I solve the problem using a state machine. Notice how the SM loops on
> >     DICTIONARYREAD until the command queue is empty.
> >
> >     DeferredCommand.addCommand(new IncrementalCommand() {
> >      @Override
> >      public boolean execute() {
> >        switch (startupState) {
> >          case INITIAL:
> >            timer.scheduleRepeating(600);
> >            startupState = StartupState.DICTIONARYREAD;
> >            break;
> >
> >          case DICTIONARYREAD:
> >            if (dictionaryRequest.getDictionaryPages()) {
> >               break;
> >            }
> >
> >            startupState = StartupState.FINAL;
> >            break;
> >
> >          case FINAL:  // Kevin's RETURN POINT?
> >            timer.cancel();
> >            return false; // command is complete
> >          }
> >        return true;
> >     });
> >
> >     public boolean getDictionaryPages() {
> >      while (dictionaryRequestList.size() > 0) {
> >        if (busy) {
> >          return true;
> >        }
> >        dictionaryRequestList.pop().execute(); // RPC and BUSY mutex
> >      }
> >      return false;
> >     }
> >
> >     --
> >     You received this message because you are subscribed to the Google
> >     Groups "Google Web Toolkit" group.
> >     To post to this group, send email to
> >     [email protected]
> >     <mailto:[email protected]>.
> >     To unsubscribe from this group, send email to
> >     
> > [email protected]<google-web-toolkit%[email protected]>
> >     
> > <mailto:google-web-toolkit%[email protected]<google-web-toolkit%[email protected]>
> >.
> >     For more options, visit this group at
> >     http://groups.google.com/group/google-web-toolkit?hl=en.
> >
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Google Web Toolkit" group.
> > To post to this group, send email to [email protected]
> .
> > To unsubscribe from this group, send email to
> > [email protected]<google-web-toolkit%[email protected]>
> .
> > For more options, visit this group at
> > http://groups.google.com/group/google-web-toolkit?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-web-toolkit%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to