私は、コルーチンを使ってスクリプトを "一時停止"し、再開する前に何らかの処理が完了するまで待つ方法を理解しようとしています。Luaの共同作業
おそらく私は間違った方法でコルーチンを見ています。しかし、私の試みは、answerに与えられた例と同様に構成されています。
loop.lua
のループは決して2回目の繰り返しに達しないため、実行中のループを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()
EDITは:うまくいけばこれを実現する方法についていくつかの助けを得るために、奨励金を追加しました。
エラーコード2は、レジュームコードが連続して実行されている場合にのみ発生します(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