2009-05-14 3 views
5

Моя ситуация в том, что я использую API Lua (C) для выполнения скрипта, содержащегося в строке. Я хотел бы, чтобы пользователь мог завершить выполнение скрипта (это важно, если скрипт содержит бесконечный цикл), как я могу это сделать?Как можно закончить поток Lua?

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

ответ

7

Вы можете использовать крючок для обратного вызова к C каждый раз, когда lua выполняет строку сценария. В этой функции hook вы можете проверить, хочет ли пользователь выйти, и вызвать 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); 
+0

Спасибо за ваше время. – CiscoIPPhone

+0

Возможно, вы хотите либо вызвать 'luaL_error (L,« message »)', либо нажать что-нибудь в стеке Lua перед вызовом 'lua_error (L)'. –

+0

Спасибо, Александр, я отредактировал ответ. Вы правильно относитесь к одиночным линиям/бесконечным циклам в коде C, я признаю, что не вникал в сложность ситуации. –

8

Крюка на линиях недостаточно. Этот код является одной строкой, но петли навсегда:

while true do end 

Вам необходимо установить крючок подсчета команд. Если я не ошибаюсь, это было бы

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

Вы хотите выбрать NUM_INSTRUCTIONS, так что не слишком мал (или вы получите накладные расходы на производительность) и не слишком большой (или вы не будете слишком долго ждать до упора).

Для соответствующих реализаций Lua см. this library.

Если вы хотите добавить дополнительную защиту от ненадежного кода Lua, google для «песочницы Lua» - это больше, чем просто бесконечная профилактика цикла.

+0

Вы правы. Должен ли третий параметр быть LUA_MASKCOUNT? Даже просто инструкции не идеальны - например, если код Lua отключается, то вызов длинной функции C. Однако теперь это будет сделано для моих целей, спасибо. – CiscoIPPhone

+0

Да, извините. Я добавил LUA_MASKCOUNT сейчас. –

 Смежные вопросы

  • Нет связанных вопросов^_^