2

当我调用此函数时,它会运行几分钟,然后脚本退出。我发现如果我将睡眠时间设置得更高,它需要更长的时间才能退出。有什么办法可以写这个让它永远不会退出?我认为这与正在使用的内存有关。循环之间的延迟必须为 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()
}   
4

1 回答 1

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.
        }
    }
}
于 2013-08-18T00:03:18.667 回答