fix(event_queue): 修复peek方法无法正确查看事件的问题
修改peek方法的实现,通过临时弹出并重新压入事件来确保正确查看环形缓冲区中的事件。使用临时vector保持事件顺序,并添加必要的互斥锁保护。
This commit is contained in:
parent
264bf3bee3
commit
3a12ee1a6d
|
|
@ -1,29 +1,46 @@
|
||||||
#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() {
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue