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

ジョンウェアがコメントしたように、

スタックがオーバーフローしたため終了します。両方の関数が自分自身を呼び出し、戻りません。再帰呼び出しを連続ループに変更して解決します。

画像検索を試行した後、関数で使用できるパスは 3 つあります。

  • 検索を実行できなかった場合、スクリプトは終了します。
  • 画像が見つからない場合、関数は戻ります。
  • それ以外の場合は、画像が見つかり、関数が繰り返されます。

最初の 2 つのケースは関数を終了するため、ループを使用するように関数を変更するのは非常に簡単です。再帰呼び出しを削除して、関数の内容を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 に答える