Выполнение обратного вызова Lua с задержкой в ​​C ++ - PullRequest
0 голосов
/ 25 октября 2018

Я хочу выполнить метод 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...