Ale*_*lex 18
你可以使用setjmp和longjump,就像Lua库在内部做的那样.这将使你摆脱困境pcalls而不需要不断地出错,防止脚本试图处理你的虚假错误并仍然让你失去执行.(我不知道这对线程有多好.)
#include <stdio.h>
#include <setjmp.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
jmp_buf place;
void hook(lua_State* L, lua_Debug *ar)
{
static int countdown = 10;
if (countdown > 0)
{
--countdown;
printf("countdown: %d!\n", countdown);
}
else
{
longjmp(place, 1);
}
}
int main(int argc, const char *argv[])
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_sethook(L, hook, LUA_MASKCOUNT, 100);
if (setjmp(place) == 0)
luaL_dostring(L, "function test() pcall(test) print 'recursing' end pcall(test)");
lua_close(L);
printf("Done!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你可以在你的程序中的某个地方设置一个变量,然后调用它forceQuitLuaScript.然后,您使用一个钩子,在这里描述运行每个n指令.在n指示之后,它将运行你的钩子,它只是检查是否forceQuitLuaScript已设置,如果是任何清理你需要做并杀死线程.
编辑:这是一个如何工作的廉价示例,只有这是单线程.这只是为了说明如何处理pcall等:
#include <stdlib.h>
#include "lauxlib.h"
void hook(lua_State* L, lua_Debug *ar)
{
static int countdown = 10;
if (countdown > 0)
{
--countdown;
printf("countdown: %d!\n", countdown);
}
else
{
// From now on, as soon as a line is executed, error
// keep erroring until you're script reaches the top
lua_sethook(L, hook, LUA_MASKLINE, 0);
luaL_error(L, "");
}
}
int main(int argc, const char *argv[])
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_sethook(L, hook, LUA_MASKCOUNT, 100);
// Infinitely recurse into pcalls
luaL_dostring(L, "function test() pcall(test) print 'recursing' end pcall(test)");
lua_close(L);
printf("Done!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)