Answer the question
In order to leave comments, you need to log in
How in lua api c++, pause the execution of a function after a certain time?
Hello dear programmers.
There is a question how in lua api c ++, suspend the execution of a function after a certain time.
Normally suspending functions if lua_resume returned yield.
Like here for an example.
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;
};
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;
};
Answer the question
In order to leave comments, you need to log in
decided so
void LUAHook(lua_State* L, lua_Debug* ar){ lua_yield(L, 0);
};
const char* LUA = R"(
function foo()
for i = 1, 6 do
print(" func foo "..i.."\n")
end
end
function main()
for i = 1, 1300 do
print(" main ", i)
end
end
)";
int main() {
lua_State* L = luaL_newstate(); luaL_openlibs(L);
lua_sethook(L, LUAHook, LUA_MASKCOUNT, 23); // Добавить подсчет счетчика, который сработает после указания числа
checkerror(L, LUA);
lua_State* L1 = lua_newthread(L);
int ret, ret1;
lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.
while (true) {
if (ret = !0) {
ret = lua_resume(L, L1, 0);
};
if (ret == LUA_YIELD || ret1 == LUA_YIELD) {
lua_getglobal(L1, "foo");
ret1 = lua_resume(L1, L, 0);
}
if (ret == 0) {// Успешно завершение функции.
break;
}
};
return 0;
};
You can find a way to interpret the code and change the behavior depending on the time.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question