Совместные подпрограммы Lua

Я пытаюсь понять, как я могу использовать совместные подпрограммы, чтобы «приостановить» сценарий и дождаться, пока не будет завершена некоторая обработка, прежде чем продолжить.

Возможно, я смотрю на co -программы неправильным образом. Но моя попытка структурирована аналогично примеру, приведенному в этом ответе .

Цикл в loop.lua никогда не достигает второй итерации и, следовательно, никогда не достигает i == 4 условие, необходимое для выхода из рабочего цикла в коде C. Если я не уступлю в loop.lua , то этот код будет работать так, как ожидалось.

main.cpp

#include 

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()

РЕДАКТИРОВАТЬ: добавлено вознаграждение, чтобы, надеюсь, получить некоторую помощь по как это сделать.

7
задан Community 23 May 2017 в 11:51
поделиться