当前位置:  开发笔记 > 编程语言 > 正文

如何干净地结束Lua线程?

如何解决《如何干净地结束Lua线程?》经验,为你挑选了2个好方法。

我的情况是我使用Lua(C)API来执行字符串中保存的脚本.我希望用户能够终止脚本的执行(如果脚本包含无限循环,这是必不可少的),我该怎么做?

lua_State *Lua = lua_open();
char * code;
// Initialisation code
luaL_dostring(L, code);

Alexander Gl.. 8

挂线是不够的.此代码是单行,但永远循环:

    while true do end

您需要设置指令计数挂钩.如果我没有弄错的话,那就是

    lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);

你想选择NUM_INSTRUCTIONS,因此它不会太小(或者你得到性能开销)并且不会太大(或者你会等到太长时间才停止).

对于相关的Lua实现,请参阅此库.

如果你想从不受信任的Lua代码添加更多保护,谷歌搜索"Lua沙盒" - 除此之外还有更多的无限循环预防.



1> Alexander Gl..:

挂线是不够的.此代码是单行,但永远循环:

    while true do end

您需要设置指令计数挂钩.如果我没有弄错的话,那就是

    lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);

你想选择NUM_INSTRUCTIONS,因此它不会太小(或者你得到性能开销)并且不会太大(或者你会等到太长时间才停止).

对于相关的Lua实现,请参阅此库.

如果你想从不受信任的Lua代码添加更多保护,谷歌搜索"Lua沙盒" - 除此之外还有更多的无限循环预防.



2> Matthew Mona..:

每次lua执行脚本行时,您都可以使用钩子回调到C语言.在这个钩子函数中,你可以检查用户是否想要退出,如果他们这样做,则调用lua_error.

static bool ms_quit = false;

void IWantToQuit()
{
    ms_quit = true;
}

void LineHookFunc(lua_State *L, lua_Debug *ar)
{
    if(ar.event == LUA_HOOKLINE)
        if(ms_quit == true)
            luaL_error(L, "Too Many Lines Error");
}
//...

lua_State *Lua = lua_open();
char * code;
// Initialisation code
lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0);
luaL_dostring(L, code);

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有