How to detect a change in a global variable ?
Tom Glod
tom at makeshyft.com
Tue Jul 29 22:56:13 EDT 2025
Happy to help.
The check for these variables happens every 50 milliseconds on each
internal loop of the engine, as per Mark W.
Checking a variable is just about the fastest thing you can do, and you can
do it millions of times every second.
I think last time I did a benchmark was about 25 million variable checks
every second. :)
The biggest key is to make sure that your condition is met even if there is
an error.
Also, When in the IDE, the wait does hinder things like switching tabs
between scripts.
On Tue, Jul 29, 2025 at 8:50 AM Martin Koob <mkoob at rogers.com> wrote:
> Hi Tom,
>
> That is even easier way to make a variable listener for LiveCode!
>
> Thanks for that recipie.
>
> I do have a question about this. I would think that ‘wait until
> [condition is true]’ must have a loop under the hood although probably much
> faster that running a loop written in LiveCode script would. Is that true?
> I am curious as to what kind of performance hit from that. (Probably
> nothing we have to worry about for a single variable listener like your
> example. If you were monitoring many variables could it have a noticiable
> effect, or I am still just stuck in the 90s.
>
> 💾👴🏻📠
>
> Best regards,
>
> Martin Koob
>
> On Jul 26, 2025, at 8:59 PM, Tom Glod via use-livecode <
> use-livecode at lists.runrev.com> wrote:
>
> When I need to detect a change in another variable I use "wait until
> variable_name is not "x" with messages" ... obviously your condition has to
> match what you are trying to detect.
> no loop needed
>
>
>
> On Sat, Jul 26, 2025 at 8:14 AM Martin Koob via use-livecode <
> use-livecode at lists.runrev.com> wrote:
>
> Hi
>
> Another way to do this is to use a setProp handler to set the global
> variable and create in essence a listener for changes to the global
> variable. In the setProp handler you set the global but then you can
> include other commands to be issued or sent or dispatched when the global
> variable is set, Of course you have to make sure that you only this
> setProp handler to set the value of global gMyVar variable.
>
> To see how this would work
>
> 1. Create a new stack with 1 button and 1 field.
>
> 2. Name the Name the button “Easy” and Name the field “Global
> VariableDisplay”.
>
> 3. Add the following script to the field “Global VariableDisplay”.
> on displayMyVar pMyStatus
>
> set the text of me to pMyStatus
>
> end displayMyVar
>
> 4. Add the following script to the button.
> on mouseUp
>
> global gMyVar
>
> if gMyVar is "easy" then
>
> set the cMyGlobalVar of this card to ""
>
> else
>
> set the cMyGlobalVar of this card to "Easy"
>
> end if
>
> end mouseUp
>
> 5. Add the following script to Card 1.
>
> setProp cMyGlobalVar pNewVar
>
> global gMyVar
>
> put pNewVar into gMyVar
>
> ## If you don't need to include a parameter with the message use
> 'send'
>
> -- send "displayMyVar" to field "GlobalVariable Display"
>
> ## If you need to include a parameter with the message use
> 'dispatch'
>
> dispatch "displayMyVar" to field "GlobalVariable Display" of me
> with gMyVar
>
> end cMyGlobalVar
>
>
>
> ## you can also access the property using a getProp handler but
>
> ## that does not make much sense since since gMyVar is a global
> which you can use directly.
>
> --getProp cMyGlobalVar
>
> -- global gMyVar
>
> -- return gMyVar
>
> --end cMyGlobalVar
>
> This would avoid any blocking or load on the machine using the loop.
>
>
> Best regards,
>
> Martin Koob
>
> On Jul 26, 2025, at 5:16 AM, scott--- via use-livecode <
>
> use-livecode at lists.runrev.com> wrote:
>
>
> Oops… just for thoroughness: In the last handler I forgot to add the
>
> line “put empty into sFlag” after the repeat loop
>
>
> --
> Scott Morrow
>
> Elementary Software
> (Now with 20% less chalk dust!)
> web https://elementarysoftware.com/
> email scott at elementarysoftware.com
> booth 1-360-734-4701
> ------------------------------------------------------
>
>
> On Jul 26, 2025, at 1:59 AM, scott--- via use-livecode <
>
> use-livecode at lists.runrev.com> wrote:
>
>
> The way that the loop is written would make it blocking. If you wanted
>
> the loop to start running and then stop after the mouseUp happens I think
> you would need to add a "wait x millisec with messages”
>
>
> Fo example:
>
> global myVar
>
> on elsoTester
> put 0 into myVar
> -- some code
> repeat until myVar > 0
> -- set the thumbPosition of scrollBar "ProgressBar" to (the
>
> thumbPosition of scrollBar "ProgressBar" + 5) -- testing
>
> wait 500 millisec with messages
> end repeat
> -- some code
> answer "Finished"
> end elsoTester
>
>
> Depending on what you are doing, another method would be to use a "send
>
> it time" mechanism where the handler keeps calling itself until myVar > 0
>
> For example:
>
>
> local sFlag
> global myVar
>
> command elsoTester
> if sFlag is empty then
> put 0 into myVar
> -- some code
> end if
>
> repeat until myVar > 0
> -- set the thumbPosition of scrollBar "ProgressBar" to (the
>
> thumbPosition of scrollBar "ProgressBar" + 5) -- testing
>
> put “waiting” into sFlag
> send elsoTester to me in 500 millisec
> exit elsoTester
> end repeat
>
> answer “Finished"
> end elsoTester
>
> To be thorough you might also might want to empty the message queue of
>
> any other elsoTester messages before sending in time or add a timer which
> will eventually time out if myVar doesn’t exceed 0 after a set time.
>
>
> --
> Scott Morrow
>
> Elementary Software
> (Now with 20% less chalk dust!)
> web https://elementarysoftware.com/
> email scott at elementarysoftware.com
> booth 1-360-734-4701
> ------------------------------------------------------
>
> On Jul 26, 2025, at 12:44 AM, jbv via use-livecode <
>
> use-livecode at lists.runrev.com> wrote:
>
>
> Hi list,
>
> Let's say I have a portion of a script like this :
>
> global myVar
> put 0 into myVar
> -- some code
> repeat until myVar > 0
> end repeat
> -- some code
>
> and the content of global myVar being changed
> in a handler of another control :
>
> on mouseUp
> global myVar
> put 1 into myVar
> end mouseUp
>
> I know this is not very elegant, but my question is :
> can the change in myVar be detected in a loop like
> above ?
> I made some tests and it doesn't seem to work...
>
> Thank you in advance.
> jbv
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
>
> subscription preferences:
>
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
>
> subscription preferences:
>
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
>
>
>
>
>
>
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
>
> subscription preferences:
>
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
>
>
More information about the use-livecode
mailing list