fix(event_queue): 修复peek方法无法正确查看事件的问题

修改peek方法的实现,通过临时弹出并重新压入事件来确保正确查看环形缓冲区中的事件。使用临时vector保持事件顺序,并添加必要的互斥锁保护。
This commit is contained in:
ChestnutYueyue 2026-02-23 02:49:01 +08:00
parent 264bf3bee3
commit 3a12ee1a6d
1 changed files with 39 additions and 26 deletions

View File

@ -1,30 +1,47 @@
#include <extra2d/event/event_queue.h> #include <extra2d/event/event_queue.h>
#include <vector>
namespace extra2d { namespace extra2d {
EventQueue::EventQueue() = default; EventQueue::EventQueue() = default;
bool EventQueue::push(const Event &event) { bool EventQueue::push(const Event &event) { return buffer_.push(event); }
return buffer_.push(event);
}
bool EventQueue::push(Event &&event) { bool EventQueue::push(Event &&event) { return buffer_.push(std::move(event)); }
return buffer_.push(std::move(event));
}
bool EventQueue::poll(Event &event) { bool EventQueue::poll(Event &event) { return buffer_.pop(event); }
return buffer_.pop(event);
}
bool EventQueue::peek(Event &event) const { bool EventQueue::peek(Event &event) const {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
if (buffer_.empty()) { if (buffer_.empty()) {
return false; return false;
} }
// 环形缓冲区不支持peek这里简化处理 // 临时弹出元素查看,然后再放回
// 实际应用中可能需要双缓冲或其他机制 // 由于RingBuffer是无锁设计这里使用互斥锁保护
Event temp;
if (!const_cast<RingBuffer<Event, DEFAULT_CAPACITY> &>(buffer_).pop(temp)) {
return false; return false;
} }
event = temp;
// 将元素重新压入队列(需要特殊处理顺序)
// 创建一个临时缓冲区来保持顺序
std::vector<Event> tempBuffer;
tempBuffer.push_back(std::move(temp));
// 弹出所有元素
Event e;
while (const_cast<RingBuffer<Event, DEFAULT_CAPACITY> &>(buffer_).pop(e)) {
tempBuffer.push_back(std::move(e));
}
// 重新压入所有元素
for (auto &item : tempBuffer) {
const_cast<RingBuffer<Event, DEFAULT_CAPACITY> &>(buffer_).push(
std::move(item));
}
return true;
}
void EventQueue::clear() { void EventQueue::clear() {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
@ -34,12 +51,8 @@ void EventQueue::clear() {
} }
} }
bool EventQueue::empty() const { bool EventQueue::empty() const { return buffer_.empty(); }
return buffer_.empty();
}
size_t EventQueue::size() const { size_t EventQueue::size() const { return buffer_.size(); }
return buffer_.size();
}
} // namespace extra2d } // namespace extra2d