Read from socket async?

Dave Cragg dcragg at lacscentre.co.uk
Sun Feb 10 06:17:00 EST 2002


At 5:58 pm +1100 10/2/02, David Vaughan wrote:
>In a post which I accidentally lost Scott Raney said to Gary Denis
>that "read from...with message" is asynchronous. In what respect,
>please?
>
>I ran the following script
>
>local lcounter
>
>on mouseUp
>   global sname
>   put zero into lcounter
>   repeat 10
>     read from socket sname until return with message "dataAdded"
>     add 1 to lcounter
>     put lcounter into field "f2"
>   end repeat
>end mouseUp
>
>on dataAdded portName,info
>   wait for 1 seconds
>   put info after field "f1"
>   subtract 1 from lcounter
>   put lcounter into field "f2"
>end dataAdded
>
>Consistent with other behaviour of Rev, the counter visibly counted
>up to ten in the repeat loop then counted back down again, as the
>stacked "dataAdded" messages were executed after the mouseUp handler
>finally exited. I would call this synchronous behaviour, consistent
>with the blocking behaviour of all Rev handlers. It is exactly as if
>one did not use the msgname option but followed the "read" with
>"send dataAdded  && it to me". Am I correct, Rev people?

I think one other proviso as to be aded to Scott's description of the 
asynch nature of <read .... with message> and <send mesaage... in> 
commands. Any queued messages will only execute after any currently 
running handler completes. (Please correct me if I've got this 
wrong.) So in this simple example, you'll have to wait 1 second for 
the doIt handler to complete.

on mouseUp
   send "doIt" to me in 10 milliseconds
   put 1
   wait 1 second
end mouseUp

on doIt
   put 2
end doIt

In your example, your repeat loop must complete before any of the 
dataAdded messages will finish. This says to me that "read .. with 
message" is truly non-blocking, i.e. the handler carries on.

It may not be what you want, but  I prefer the reassurance of knowing 
that a handler will complete before any queued stuff is going to 
happen. (I find asynch stuff scary at the best of times.) And in 
those cases where you want more control over the sequencing, there 
are the "wait until ... with messages" and "wait for messages" 
commands. For example, try this slightly modified version of your 
script (untried):

on mouseUp
   global sname
   put zero into lcounter
   repeat 10
     read from socket sname until return with message "dataAdded"
     add 1 to lcounter
     wait until lcCounter = (lcCounter -1) with messages ##this is the block
     put lcounter into field "f2"
   end repeat
end mouseUp

on dataAdded portName,info
   wait for 1 seconds
   put info after field "f1"
   subtract 1 from lcounter
   put lcounter into field "f2"
end dataAdded

Cheers
Dave Cragg



More information about the use-livecode mailing list