diff --git a/src/module/timer.cpp b/src/module/timer.cpp index bf209ea..15d19af 100644 --- a/src/module/timer.cpp +++ b/src/module/timer.cpp @@ -27,7 +27,7 @@ module::timer::~timer() ::ithread::stop(); ::ithread::wait(); } -std::string module::timer::add(const std::string& name, const std::string& filepath, const std::string& funname, int msec, bool loop, sol::this_state ts) +std::string module::timer::add(const std::string& name, const std::string& filepath,int msec, sol::this_state ts) { GET_APP; std::string filepath2; @@ -48,9 +48,7 @@ std::string module::timer::add(const std::string& name, const std::string& filep timer_info ti; ti.name = name; - ti.funname = funname; ti.filepath = filepath2; - ti.loop = loop; ti.msec = msec; ti.exec_msec = time::now_msec() + msec; @@ -106,33 +104,19 @@ bool module::timer::run() }; auto exec_func = [&](timer_info& ti)->bool { std::string exception_string; + auto lua = m_app->state->get(); try { - // 加载LUA文件 - if (ti.lua == nullptr) + auto lbResult = lua->state->load_file(ti.filepath); + if (lbResult.valid() == false) { - ti.lua = m_app->state->get(); - auto lbResult = ti.lua->state->load_file(ti.filepath); - if (lbResult.valid() == false) - { - sol::error err = lbResult; - throw ylib::exception("Failed to load script, " + std::string(err.what())); - } - lbResult(); + sol::error err = lbResult; + throw ylib::exception("Failed to load script, " + std::string(err.what())); } - // 加载函数 - if (ti.funname != "" && ti.function.valid() == false) - ti.function = (*ti.lua->state)[ti.funname]; - // 执行函数 - if (ti.function.valid()) - { - auto result = ti.function(); - if (!result.valid()) { - sol::error err = result; - throw ylib::exception(err.what()); - } - bool rd = result; - return rd; + sol::protected_function_result result = lbResult(); + if (!result.valid()) { + sol::error err = result; + throw ylib::exception(err.what()); } } catch (const std::exception& e) @@ -142,6 +126,8 @@ bool module::timer::run() m_app->log->error("[timer][" + ti.filepath + "]: " + e.what(), __FILE__, __func__, __LINE__); return false; } + lua->state->collect_garbage(); + m_app->state->push(lua); return false; }; // 获取等待时间 @@ -156,40 +142,20 @@ bool module::timer::run() std::unique_lock uni(m_mutex); auto now_msec = time::now_msec(); - for (auto iter = m_list.begin(); iter != m_list.end();) + for (auto iter = m_list.begin(); iter != m_list.end();iter++) { if (iter->second.exec_msec <= now_msec) { - bool ready_remove = false; - if (exec_func(iter->second) == false) - ready_remove = true; - if (ready_remove == false) - { - if (iter->second.loop == false) - ready_remove = true; - else - { - iter->second.exec_msec = now_msec + iter->second.msec; - } - } - if (ready_remove) - iter = m_list.erase(iter); - else - iter++; + exec_func(iter->second); + iter->second.exec_msec = now_msec + iter->second.msec; } - else - iter++; } std::string name; while (m_removed.pop(name)) { auto iter = m_list.find(name); if (iter != m_list.end()) - { - iter->second.lua->state->collect_garbage(); - m_app->state->push(iter->second.lua); m_list.erase(iter); - } } diff --git a/src/module/timer.h b/src/module/timer.h index 6881293..a8f3dd0 100644 --- a/src/module/timer.h +++ b/src/module/timer.h @@ -11,11 +11,8 @@ namespace module struct timer_info { std::string filepath; std::string name; - std::string funname; - bool loop = false; timestamp exec_msec = 0; timestamp msec = 0; - luastate* lua = nullptr; sol::function function; }; /// @@ -30,11 +27,10 @@ namespace module /// /// /// - /// /// /// /// - std::string add(const std::string& name,const std::string& filepath,const std::string& funname,int msec,bool loop, sol::this_state ts); + std::string add(const std::string& name,const std::string& filepath,int msec, sol::this_state ts); /// /// 移除 ///