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

Autohotkey 导致脚本退出的递归函数,autohotkey,Autohotkey,当我调用这个函数时,它会运行几分钟,然后脚本退出。我发现,如果我将睡眠时间设置得更高,它需要更长的时间才能退出。有没有什么方法可以让它永远不存在?我认为这与正在使用的内存有关。环路之间的延迟必须为500ms或更低 Waitbeforefight() { Random, Wbf, 500, 500 sleep %Wbf% ImageSearch, FoundX2, FoundY2, 855, 915, 1024, 1071, *30 E:\Desktop\Capture23

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

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()
}   
正如Jongware评论的那样


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

尝试图像搜索后,函数可以采用三种路径:

  • 如果无法执行搜索,脚本将退出
  • 如果找不到图像,则函数返回
  • 否则,将找到图像并重复该函数
由于前两种情况是退出函数,因此将函数更改为使用循环非常简单:只需删除递归调用并将函数的内容包装在
循环{}
中即可

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.
        }
    }
}

它退出是因为堆栈溢出:两个函数都调用自己,并且永远不会返回。将递归调用更改为连续循环来解决它。哈哈,很有趣。我可以在if..then语句的循环中放入一个循环,然后在if..then语句中放入更多if..then语句吗?你能举个例子吗?对于第一个,一旦找到图像,它就会返回,这就是我想要它做的。我希望它永远持续下去,直到找到图像为止。谢谢对不起,我不能给你一个例子,因为我不知道这是什么样的编程语言。它有手册吗?是自动热键。是的,网上有文档。不过没关系,我可以问问其他地方。