0

重複の可能性:
Lua の無限ループを防ぐ

これは C# (Lua インターフェイス) 固有の質問です。ネイティブ C Lua のようには機能しません。そのため、Lua C# の経験がない場合は、回答が役立つかどうかよく考えてください。ありがとうございます。

したがって、問題は、ユーザーがこのようなスクリプトを提供した場合です

while (true) do end

Luaが私に死ぬことなく、どうやってそれをきれいに中止するのですか? 私は多くのアプローチを試しましたが、別のスレッドからlua.Close()を呼び出すだけで、Lua API の呼び出しで保護されていないエラーが発生するだけです (nil 値にインデックスを付けようとする)エラー、問題の原因は Lua ではないことですスレッド セーフであり、別のスレッドから close を呼び出す必要があるため (メイン スレッドは DoString 呼び出しでビジー状態です)、ちょっとした問題です。デバッグフックを追加しようとしましたが、DoString スレッドとフックの間でスレッド ID が同じであることも確認しました。それらは同じです。つまり、フックで実行されたものはすべて DoString スレッドで実行されます。これは役に立ちませんが、それでも例外が発生します。どうやって ... Lua C# で DoString を中止しますか!?

ありがとう

編集

もう少し進んで、lua クラスを破棄すると、無限のDoStringを実行しているスレッドで例外が発生します。VStudio からのデバッグでは、これをキャッチして回復できます。しかし、デバッグまたはリリースでexeを実行すると、回復できずにクラッシュすることがあります!? DoStringスレッドから得られるエラーは

保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

4

1 に答える 1

2

どうやって ... Lua C# で DoString を中止しますか!?

それが C#、C、C++ などからのものであるかどうかは問題ではありません。Lua は単に停止したいからといって停止するわけではありません。本質的にシングルスレッドです。つまり、Lua スクリプトの実行は、戻ったときに停止します。また、1 つのスレッドがアクティブなときに 1 つのスレッドから Lua 状態を呼び出すことは合法ではないため、直接できることはあまりありません。

Lua は、そのように使用することを意図していません。

lua クラスを破棄すると

実行中の Lua 状態を破棄することはできません。デバッグ フックから例外をスローしてもうまくいかない場合は、何もできません。

于 2012-07-24T08:05:30.403 に答える