0

可能重复:
防止 Lua 无限循环

这是一个针对 C#(Lua 接口)的 Lua 特定问题,它不像在原生 C Lua 中那样工作,所以如果您没有 Lua C# 的经验,请三思而后行,如果您的回答对我有帮助,谢谢

所以问题是如果用户提供这样的脚本

while (true) do end

我怎么在没有 Lua 死在我身上的情况下干净地中止它?我尝试了很多方法,仅从单独的线程调用lua.Close()只会在调用 Lua API(尝试索引 nil 值)错误时给您一个不受保护的错误,问题的根源是 Lua 不是线程安全,并且由于我必须从一个单独的线程调用 close(主线程正忙于为 DoString 调用提供服务),所以它有点 22 问题。我尝试添加一个调试钩子,并检查 DoString 线程和钩子之间的线程 ID 是否相同,它们是相同的,因此钩子中执行的任何内容都在 DoString 线程上执行。这无济于事,仍然出现异常。你是如何在 Lua C# 中中止 DoString 的!?

谢谢

编辑

更进一步,如果我处理 lua 类,我会在运行无限DoString的线程中得到一个异常,在 VStudio 的调试中,我可以抓住它并恢复。但是,如果我在调试或发布中运行 exe,我有时无法恢复并崩溃!?我从 DoString 线程得到的错误是

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

4

1 回答 1

2

How the ... do you abort a DoString in Lua C#!?

It doesn't matter if it's from C#, C, C++, or whatever. Lua doesn't simply stop just because you want it to. It is inherently single-threaded, which means that the execution of a Lua script will stop when it returns. And since it's not legal to call into a Lua state from one thread while one thread is active, there's not much you can do directly.

Lua simply isn't intended to be used in that way.

if I dispose the lua class

You can't dispose of the Lua state while it's running. If throwing an exception from a debug hook doesn't work, then there is simply nothing you can do.

于 2012-07-24T08:05:30.403 回答