cyanray / mirai-cpp

本项目为 mirai-api-http 的 C++ 封装,方便使用 C++ 开发基于 mirai-api-http 插件。
GNU Affero General Public License v3.0
148 stars 38 forks source link

事件处理循环不合理,导致事件不及时处理 #70

Closed cyanray closed 3 years ago

cyanray commented 3 years ago

关键在于mirai_bot.cpp的第950行

cv.wait(lock);     // 在这之前,应该检查 event_queue 是否为空

因为在处理事件时,event_queue 可能会被其他线程修改,此时 event_queue 不为空,应该继续往下走,而不是 wait 新的事件。如果直接 cv.wait,就只能等下一次 event_queue 被修改时,才会从 cv.wait 中返回。

修改后的代码:

......
unique_lock<mutex> lock(mutex_event_queue);
+if (event_queue.empty())
+{
    cv.wait(lock);
+}
if (event_queue.empty()) continue;
......

😫