On Fri, Aug 13, 2010 at 7:23 AM, Kevin Qiu <kevin.jing....@gmail.com> wrote:
> 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. > Of course the DeferredCommand isn't blocking. I know that. The SM just loops at DICTIONARYREAD until the queue empties. Post your entire implementation of the execute() method. Do not put code at //1 or //2 Did my example show that? I don't think it did. //1 and //2 should be inside the SM. Did you code an implementation or just do a desk check? The dictionary entries are downloaded one at a time. The UI isn't live until all downloads complete. Either way, it looks like I've failed to communicate how this works. If you want to see a live demo, feel free to send an OpenID, I'll add it to to the authorization and you can watch it using FF and Firebug. > 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 <jchim...@gmail.com> 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 <jchim...@gmail.com >> > <mailto:jchim...@gmail.com>> 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 >> > google-web-toolkit@googlegroups.com >> > <mailto:google-web-toolkit@googlegroups.com>. >> > To unsubscribe from this group, send email to >> > >> > google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com> >> > >> > <mailto:google-web-toolkit%2bunsubscr...@googlegroups.com<google-web-toolkit%252bunsubscr...@googlegroups.com> >> >. >> > 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 >> google-web-tool...@googlegroups.com. >> > To unsubscribe from this group, send email to >> > google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com> >> . >> > 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 google-web-tool...@googlegroups.com. >> To unsubscribe from this group, send email to >> google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com> >> . >> 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 google-web-tool...@googlegroups.com. > To unsubscribe from this group, send email to > google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com> > . > 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 google-web-tool...@googlegroups.com. To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.