【发布时间】:2011-11-04 14:31:44
【问题描述】:
我正在尝试了解如何使用协同程序来“暂停”脚本并等到某些处理完成后再恢复。
也许我以错误的方式看待协同例程。但我的尝试的结构类似于answer 中给出的示例。
loop.lua 中的循环永远不会达到第二次迭代,因此永远不会达到退出 C 代码中正在运行的循环所需的 i == 4 条件。如果我没有在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()
编辑:添加了赏金,希望能在如何完成此任务方面获得一些帮助。
【问题讨论】:
标签: c++ scripting lua coroutine