导致我的脚本退出的递归函数

时间:2013-08-17 23:02:40

标签: autohotkey

当我调用此函数时,它会运行几分钟然后脚本退出。我发现如果我将睡眠时间设置得更高,它需要更长时间才能退出。我有什么方法可以写这个,以便它永远不会退出?我认为这与使用的内存有关。循环之间的延迟必须为500毫秒或更低。

Waitbeforefight()
{
    Random, Wbf, 500, 500
    sleep %Wbf%
    ImageSearch, FoundX2, FoundY2, 855, 915, 1024, 1071, *30 E:\Desktop\Capture23.png
    if ErrorLevel = 2
    {
        MsgBox Could not conduct the search.
        ExitApp
    }
    else if ErrorLevel = 1
    {
        return
    }
    else
    {
        sleep %Wbf%
        Waitbeforefight()
    }
}

即使我制作了这样一个简单的剧本,也会退出。

func1()
{
    sleep 50    
    func1()
}

F1::
{
    func1()
}   

1 个答案:

答案 0 :(得分:1)

正如Jongware评论的那样,

  

它退出是因为堆栈溢出:两个函数都调用自己,并且永远不会返回。将递归调用更改为连续循环以解决它。

尝试图像搜索后,您的功能可以采用三种路径:

  • 如果无法进行搜索,则退出脚本。
  • 如果找不到图像,则函数返回。
  • 否则,找到图像并重复该功能。

由于前两个案例正在退出函数,因此更改函数以使用循环非常简单:只需删除递归调用并将函数内容包装在Loop {}中。

Waitbeforefight()
{
    Loop
    {
        Random, Wbf, 500, 500
        sleep %Wbf%
        ImageSearch, FoundX2, FoundY2, 855, 915, 1024, 1071, *30 E:\Desktop\Capture23.png
        if ErrorLevel = 2
        {
            MsgBox Could not conduct the search.
            ExitApp
        }
        else if ErrorLevel = 1
        {
            return
        }
        else
        {
            sleep %Wbf%
            ; Instead of calling self, just allow the loop to continue.
        }
    }
}
相关问题