Я хочу выполнить метод createEvent
, первым аргументом которого является обратный вызов, который должен быть выполнен в C ++ после некоторой задержки (второй аргумент):
createEvent(function() print("Event has been fired.") end, 10)
Когда событиезаканчивается, обратный вызов никогда не выполняется.
Это то, что у меня есть в стеке до вызова lua_pcall
:
nil, boolean, userdata
Как это должно быть сделано правильно?
Это то, что я пробовал до сих пор:
struct LuaCallbackEvent {
int32_t delay;
int32_t ref;
LuaCallbackEvent() : delay(0), ref(0) { }
};
int32_t _lua_createEvent(lua_State* L) {
// Callback delay
auto delay = lua_tonumber(L, 2);
// Lua callback reference
auto lua_cb = luaL_ref(L, LUA_REGISTRYINDEX);
LuaCallbackEvent cb;
cb.delay = delay;
cb.ref = lua_cb;
EventManager::instance().CreateLuaCallback(cb);
return 0;
}
// Gets called when specfic time has elapsed
void ExecuteLuaCallback(LuaCallbackEvent* ev) {
if (!L) {
LERR << "No state";
return;
}
// Retrieve callback by the reference
lua_rawgeti(L, LUA_REGISTRYINDEX, ev->ref);
// Execute callback
lua_pcall(L, 1, LUA_MULTRET, 0);
// Unset reference
luaL_unref(L, LUA_REGISTRYINDEX, ev->ref);
}