У меня есть сетевое приложение, которое использует сценарии Lua. После запуска приложения я создаю глобальное состояние Lua и загружаю все файлы сценариев, которые содержат различные функции, и для каждого клиента, который подключается, я создаю поток Lua для этого соединения.Отменить доход от хоста
// On start
var GL = luaL_newstate();
// register functions...
// load scripts...
// On connection
connection.State = lua_newthread(GL);
Когда приходит запрос, в котором используется скрипт, я получаю глобальную функцию и вызываю ее.
var NL = connection.State;
var result = lua_resume(NL, 0);
if (result != 0 && result != LUA_YIELD)
{
// error...
result = 0;
}
if (result == 0)
{
// function returned...
}
Теперь, некоторые сценарии требуют ответа на что-то от клиента, так что выход в этих функциях, ждать его. Когда ответ приходит, сценарий возобновляется с lua_resume(NL, 1)
.
// Lua
text("How are you?")
local response = select("Good", "Bad")
// Host
private int select(IntPtr L)
{
// send response request...
return lua_yield(L, 1);
}
// On response
lua_pushstring(NL, response);
var result = lua_resume(NL, 1);
// ...
Моя проблема заключается в том, что мне нужно, чтобы иметь возможность отменить этот выход, и возврата из функции Lua, без выполнения каких-либо больше кода в функции Lua, и без добавления дополнительного кода скриптов. Другими словами, я в основном хочу, чтобы поток Lua выдавал исключение, возвращался к началу и забывал, что он когда-либо выполнял эту функцию.
Возможно ли это?
Одна вещь, которую я думал, может работать, но не сделал, звонил lua_error
. Результатом стал SEHException
по вызову lua_error
. Я предполагаю, что сценарий в настоящее время не работает, но уступает.