Я пытаюсь понять, как я могу использовать совместные подпрограммы, чтобы «приостановить» сценарий и дождаться завершения обработки до возобновления.Lua co-routines
Возможно, я смотрю на совместные процедуры неправильным образом. Но моя попытка структурирована аналогично примеру, приведенному в этом answer.
Петля в loop.lua
никогда не достигает второй итерации и, следовательно, никогда не достигает условия i == 4
, необходимого для выхода из цикла работы кода C. Если я не выхожу в loop.lua
, тогда этот код выполняет как ожидалось.
main.cpp
#include <lua/lua.hpp>
bool running = true;
int lua_finish(lua_State *) {
running = false;
printf("lua_finish called\n");
return 0;
}
int lua_sleep(lua_State *L) {
printf("lua_sleep called\n");
return lua_yield(L,0);
}
int main() {
lua_State* L = lua_open();
luaL_openlibs(L);
lua_register(L, "sleep", lua_sleep);
lua_register(L, "finish", lua_finish);
luaL_dofile(L, "scripts/init.lua");
lua_State* cL = lua_newthread(L);
luaL_dofile(cL, "scripts/loop.lua");
while (running) {
int status;
status = lua_resume(cL,0);
if (status == LUA_YIELD) {
printf("loop yielding\n");
} else {
running=false; // you can't try to resume if it didn't yield
// catch any errors below
if (status == LUA_ERRRUN && lua_isstring(cL, -1)) {
printf("isstring: %s\n", lua_tostring(cL, -1));
lua_pop(cL, -1);
}
}
}
luaL_dofile(L, "scripts/end.lua");
lua_close(L);
return 0;
}
loop.lua
print("loop.lua")
local i = 0
while true do
print("lua_loop iteration")
sleep()
i = i + 1
if i == 4 then
break
end
end
finish()
EDIT: Добавлен Баунти, мы надеемся получить некоторую помощь о том, как достичь этого.
Код ошибки 2 возникает только при последовательном запуске кода резюме (более одного, без другого выхода). Любая другая ошибка, которую я получаю, это: «попытка вызвать строковое значение».Поп-код: 'if (lua_isstring (cL, -1)) { \t \t printf (" isstring:% s \ n ", lua_tostring (cL, -1)); \t \t lua_pop (cL, -1); \t} ' – dcousens
« попытка вызвать строку »означает, что что-то еще находится в стеке, отличном от вашей подпрограммы, возможно, сообщение об ошибке. И когда возобновление заканчивается с возвратом 0, процедура выполняется, и вы больше не можете ее возобновить, она больше не находится в стеке. Вы можете возобновить повтор только в том случае, если в последний раз вы получили доход или нажали новую процедуру в стеке. – BMitch
Как я могу получить сообщение об ошибке, если не через код выше? – dcousens