Search FAQ

Gammon Forum

Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the password reset link.
 Entire forum ➜ MUSHclient ➜ General ➜ Client crash, issue with while loop, need a code review...

Client crash, issue with while loop, need a code review...

Posting of new messages is disabled at present.

Refresh page


Posted by Randm   (3 posts)  Bio
Date Thu 13 May 2021 03:41 PM (UTC)
Message
I'm sure this code makes the whole client crash, but I'm not sure what is the issue.

Could you please help me out?

Thanks!


function wait_busy(cmd)
    
    EnableGroup("wait_busy",1)
    SetVariable("wait_busy_isbusy", "y")
    while true do
        if GetVariable("wait_busy_isbusy") == "y" then
            DoAfterSpecial(0.3,'SendNoEcho("checkbusy")',12)
        elseif GetVariable("wait_busy_isbusy") == "n" then
            EnableGroup("wait_busy",0)
            if cmd then 
                Execute(cmd) 
            end
            break
        else
            break
        end
    end
end
<triggers>
  <trigger
   expand_variables="y"
   group="wait_busy"
   keep_evaluating="y"
   match="^You are not busy$"
   name="wait_busy_disable"
   regexp="y"
   script="wait_busy_disable"
   send_to="12"
   sequence="100"
   variable="wait_busy_disable"
  >
  <send>SetVariable("wait_busy_isbusy", "n")</send>
  </trigger>
</triggers>
Top

Posted by Nick Gammon   Australia  (23,122 posts)  Bio   Forum Administrator
Date Reply #1 on Thu 13 May 2021 07:16 PM (UTC)

Amended on Thu 13 May 2021 10:11 PM (UTC) by Nick Gammon

Message

 SetVariable("wait_busy_isbusy", "y")
    while true do
        if GetVariable("wait_busy_isbusy") == "y" then
        ...
        end
    end


There is nothing there to make that condition not true, thus the client will go into an infinite loop.

Despite you issuing function calls to do things after 0.3 seconds and so on, nothing else is done until the script ends. In particular, those calls to DoAfterSpecial will not do anything yet.

See http://www.gammon.com.au/forum/?id=4956 for how to make a pause.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Nick Gammon   Australia  (23,122 posts)  Bio   Forum Administrator
Date Reply #2 on Thu 13 May 2021 07:44 PM (UTC)

Amended on Thu 13 May 2021 10:09 PM (UTC) by Nick Gammon

Message
See http://www.gammon.com.au/forum/?id=6534 for a small timer script that you can use to break out of long loops. That can get control back to the client so you don't lose any changes you made.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Randm   (3 posts)  Bio
Date Reply #3 on Thu 13 May 2021 11:01 PM (UTC)

Amended on Thu 13 May 2021 11:42 PM (UTC) by Randm

Message
Thanks Nick!

Especially for that small timer script. It saves a lot.

However, I still have some question for the wait.make function.

What I want to do is make an common function to check the busy status.
If I make a busy test function like this

require "wait"
function checkbusy()
  wait.make(function ()
    while true do 
        wait.time(0.3)
        SendNoEcho("checkbusy")
        local l = wait.regexp("^You are not busy$",3,4)
        if l and string.find(l, "not busy") then 
            break 
        end
    end
  end)
end


can it be called in other functions? like

require "wait"
function doSomething()
  wait.make(function()

        do something here ...
        
        checkbusy()

        do something else ...
  end)
end
Top

Posted by Nick Gammon   Australia  (23,122 posts)  Bio   Forum Administrator
Date Reply #4 on Fri 14 May 2021 04:39 AM (UTC)
Message
The waiting is done in the inner function, not the outer one. So I think instead you could do this (not tested however):


require "wait"
function checkbusy()
  while true do 
      wait.time(0.3)
      SendNoEcho("checkbusy")
      local l = wait.regexp("^You are not busy$",3,4)
      if l and string.find(l, "not busy") then 
          break 
      end -- if
  end -- while
end  -- function checkbusy


And then:


require "wait"
function doSomething()
  wait.make(function()

     --   do something here ...
        
        checkbusy()

     --   do something else ...
  end)
end


So "checkbusy" does the work of finding when you are not busy, however your other functions just call that to save doing it themselves every time.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).

To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.


12,675 views.

Posting of new messages is disabled at present.

Refresh page

Go to topic:           Search the forum


[Go to top] top

Information and images on this site are licensed under the Creative Commons Attribution 3.0 Australia License unless stated otherwise.