On 1 Mar 2007, at 09:26, Dick Kriesel wrote:

On 2/28/07 3:27 PM, "J. Landman Gay" <[EMAIL PROTECTED]> wrote:

The important part is the "wait <time> with messages", which allows user
input to occur simultaneously. That will allow you to put in a "stop"
button. But while "wait with messages" does allow the messages to
happen, it does not allow them to be acted on. They will pile up in a
queue until the loop is exited. Some of them, anyway. I think some were
just lost.

Jacque, could you please clarify this?  What's the difference between
happening and being acted on?  If Rev loses messages, I'd like to
understand, so I don't write code that's likely to fail and that cannot be
debugged.

I don't know of any case of messages being lost. Generally, the approach outlined by Mark works fine. But there are a couple of things to watch out for.

1. Be careful that you can't re-enter the original script. You could do this by disabling the button (if that's what's used) or setting a flag of some kind. (The example below disables the Start button.) If you don't do this, it's hard to predict what will happen. Try disabling the "disable me" line below, and then click the Start button a few times. And then the Stop button.

If you do want the process to be re-enterable (doing many things in parallel), you'll need to keep track of the different "threads". Perhaps by using an array of some kind. (libUrl does this kind of thing with mutiple load requests.)

2. Be careful of placing other "wait .. with messages" commands before an earlier one has been "released". Again, in the example below, try uncommenting the marked line in the "processToWaitFor" handler. You'll see that it stops the repeat loop in mouseUp handler. This can be a hidden problem if you bundle something in a library that runs asynchronously, and uses a callback to indicate it has finished.


## EXAMPLE based on Mark's earlier example, two buttons named "Start" and "Stop"

##script of button "Start"

local sProcessDone, sMessageID

on mouseUp
  disable me ## Point 1 stop re-entry
  put false into sProcessDone
  send "processToWaitFor" to me in 0 milliseconds

  put 0 into tCounter
  repeat until sProcessDone or tCounter >= 100
    wait for 100 milliseconds with messages
    add 1 to tCounter
    put tCounter
  end repeat
  put "DONE"
  enable me ## OK now
end mouseUp

on processToWaitFor
  ## simulated backgroun process
  send "processFinished" to me in 10 seconds
  put the result into sMessageID
  ##wait until sProcessDone with messages ## Point 2 CAREFUL

end processToWaitFor

on processFinished
  put true into sProcessDone
end processFinished

on stopButtonClicked
  cancel sMessageID
  put true into sProcessDone
end stopButtonClicked

##script of button "Stop"

on mouseUp
  send "stopButtonClicked" to button "Start"
end mouseUp

Cheers
Dave
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to