2012-07-24 93 views
0

可能重复:
Prevent Lua infinite loop中止无限DoString呼叫

这是一个Lua为C#(LUA接口)的具体问题,它不会在本地C Lua的工作,所以请如果你没有经验的Lua C#请三思如果你的回答可以帮我,谢谢

所以问题是如果用户提供一个脚本l ike this

while (true) do end 

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

感谢

编辑

得到远一点,如果我处置LUA类我得到线程的异常运行无限DoString,从VStudio调试我只能赶上这一点,恢复。但是,如果我运行exe或者在调试或发布我有时不能恢复和崩溃!?我从DoString线程得到的错误是

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

+0

你在谈论哪个“Lua for C#”? – 2012-07-24 07:58:21

+0

有多个? http://code.google.com/p/luainterface/ – Anders 2012-07-24 08:00:48

+0

是的,我个人更喜欢https:// github。com/jsimmons/LuaSharp在Mono下运行。 – Pondidum 2012-07-24 08:16:24

回答

2

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

不管它是否来自C#,C,C++或其他。 Lua并不仅仅因为你想要而停下来。它本质上是单线程的,这意味着当它返回时,Lua脚本的执行将会停止。由于在一个线程处于活动状态时从一个线程调入Lua状态是不合法的,因此您可以直接执行的操作并不多。

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

如果我处置LUA类

,而它的运行不能处置的Lua状态的。如果从调试钩子抛出异常不起作用,那么就没有办法。

+0

感谢您的回复。你如何发出Lua错误信号?我试过在钩子上做一个lua.DoString(“垃圾”)调用,但它不会帮助 – Anders 2012-07-24 08:08:11

+0

@Anders:实际上,我意识到LuaInterface的错误机制可能不起作用,因为Lua的错误通过setjmp/longjump工作,与LuaInterface不搭配。所以赔率很好,你根本无法做到这一点。 – 2012-07-24 08:13:16

+0

我不喜欢依赖用户正确的做事。他们怎么能把它设计得这么糟糕:/ – Anders 2012-07-24 08:18:01