Logan Shaw a �crit :
> Luc Le Blanc wrote:
>
> > Does PrgUserCancel work when tapping the Cancel button in Progress
> > dialogs? I wonder because I sprinkled the code of a lengthy computation
> > process (60s on a IIIxe) with calls to this macro, but I never get a
> > true when I tap or hold the stylus on the Cancel button of the Progress
> > dialog. I then converted all these calls into calls to a UserAbort
> > function:
> >
> > Boolean UserAbort( ProgressPtr progress )
> > {
> > if ( PrgUserCancel( progress ) )
> > return true;
> > else
> > return false;
> > }
> >
> > to conveniently put a breakpoint on the "return true" line, which I
> > never hit. But if I put a breakpoint on the test, I keep stopping, which
> > proves I do call this function often.
>
> I've never used the built-in progress stuff, but I'm guessing you need
> to call PrgHandleEvent() and you're not.
>
> Here's an interesting article about using the built-in progress stuff:
>
> http://www.developer.com/lang/other/article.php/615961
>
> One thing I don't understand about the example code in that article
> is it does this inside its loop:
>
> EvtGetEvent(&event, 0);
> if (!PrgHandleEvent(prg, &event))
> if (PrgUserCancel(prg))
> break;
>
> Seems like that should be a loop instead of an if statement, since
> by the very nature of it, using a progress bar indicates you're
> probably doing something slow which is divided into chunks which
> individually might be also slow. Which means by the time you've
> finished a whole chunk, you might have multiple events queued up.
> Without a loop, you only process a single event per chunk of your
> operation.
>
> So, I wonder, wouldn't it be better to do something like this?
>
> Boolean canceled;
>
> canceled = false;
> while (true)
> {
> EvtGetEvent (&event, 0);
> if (event.eType == nilEvent)
> break;
>
> if (! PrgHandleEvent (prg, &event))
> {
> if (PrgUserCancel (prg))
> {
> canceled = true;
> break;
> }
> }
> }
>
> That way, when they do hit cancel, or whatever, all the events in
> the queue will get handled right away instead of one per chunk.
>
> - Logan
Amazingly, I had written some similar code a while ago, but back then my data
sets were too small to produce long enough computations to stop them. Now that
I do, I couldn't remember why this UserAbort proc was so complicated so I had
trimmed it down to calling PrgUserCancel alone, which is definitely not
enough. My final and working version is:
Boolean UserAbort( ProgressPtr progress )
{
EventType event;
while ( EvtSysEventAvail( false ) )
{
EvtGetEvent( &event, 0 );
if ( !PrgHandleEvent( progress, &event ) )
if ( PrgUserCancel( progress ) )
return true;
};
return false;
}
--
Luc Le Blanc
--
For information on using the Palm Developer Forums, or to unsubscribe, please
see http://www.palmos.com/dev/support/forums/