中止无限的DoString调用

时间:2012-07-24 07:55:25

标签: c# lua

  

可能重复:
  Prevent Lua infinite loop

这是一个Lua for C#(Lua界面)的具体问题,它不像原生C Lua那样工作,所以如果你没有Lua C的经验,那么如果你的答案可以帮助我,请三思而后行,谢谢< /强>

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

while (true) do end

如果没有Lua死在我身上,我怎么干净地堕胎?我已经尝试了很多方法,只需从一个单独的线程调用 lua.Close()就会在调用Lua API时给你一个无保护错误(尝试索引一个nil值) )错误,问题的根源是Lua不是线程安全的,因为我必须从一个单独的线程调用close(主线程忙于服务DoString调用)它有点片刻22问题。我尝试添加一个调试钩子,并检查线程ID在DoString线程和钩子之间是否相同,它们是相同的,在钩子中执行的任何东西都在DoString线程上执行。这没有帮助,仍然得到例外。怎么......你在Lua C中中止DoString#!?

由于

修改

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

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

1 个答案:

答案 0 :(得分:2)

  

如何...你在Lua C中中止DoString#!?

无论是来自C#,C,C ++还是其他什么都无关紧要。 Lua并不仅仅因为你想要而停止。它本质上是单线程的,这意味着Lua脚本的执行将在它返回时停止。而且,因为在一个线程处于活动状态时从一个线程调用Lua状态是不合法的,所以没有太多可以直接执行。

Lua根本不打算以这种方式使用。

  

如果我处理lua类

在运行时,无法处置Lua状态。如果从调试钩子中抛出异常不起作用,那么你根本无能为力。