Здравствуйте, уважаемые программисты.
Есть вопрос как в lua api c++, приостановить выполнение функции через определенное время.
Обычно приостановление функций, если lua_resume вернула yield.
Как тут для примера.
Функция main вызывает функцию my_yield и функция main приостановиться уступая функции foo.
Как это сделать без вызова функции my_yield?
Есть вопрос как в lua api c++, приостановить выполнение функции через определенное время.
Обычно приостановление функций, если lua_resume вернула yield.
Как тут для примера.
Код |
---|
int my_yield(lua_State* L) { return lua_yield(L, 0); }; const char* LUA = R"( function foo() print(" func foo \n") end function main() for i = 1, 3 do print(" func main "..i.."\n") my_yield() end end )"; int main(int argc, char* argv[]) { lua_State* L = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/ luaL_openlibs(L); lua_State* L1 = lua_newthread(L); cout << "\n"; lua_register(L, "my_yield", my_yield); checkerror(L, LUA); lua_getglobal(L, "main"); while (true) { int ret = lua_resume(L, L1, 0); if (ret == LUA_YIELD) { lua_getglobal(L1, "foo"); lua_pcall(L1, 0, 0, 0); } else if (ret == 0) { break; } }; lua_close(L); return 0; }; |
Функция main вызывает функцию my_yield и функция main приостановиться уступая функции foo.
Как это сделать без вызова функции my_yield?
Код |
---|
int my_yield(lua_State* L) { this_thread::sleep_for(chrono::milliseconds(306));// задержка return lua_yield(L, 0); }; const char* LUA = R"( function foo() print(" func foo \n") end function main() while true do print(" main \n") end end )"; int main(int argc, char* argv[]) { lua_State* L = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/ luaL_openlibs(L); lua_State* L1 = lua_newthread(L); checkerror(L, LUA); lua_getglobal(L, "main");// получить функцию. while (true) { thread th(my_yield, std::ref(L)); //th.detach();// независимый поток. int ret = lua_resume(L, L1, 0); cout << ret << endl; if (ret == LUA_YIELD) { lua_getglobal(L1, "foo"); lua_pcall(L1, 0, 0, 0); break; } else if (ret == 0) {/*Когда функция lua_resume возвращается, стек содержит все значения, переданные в lua_yield, или все значения, возвращенные телом функции.*/ } }; lua_close(L); return 0; }; |