From 3a12ee1a6d5f5f5efe925475ec40f4e17a20bb34 Mon Sep 17 00:00:00 2001 From: ChestnutYueyue <952134128@qq.com> Date: Mon, 23 Feb 2026 02:49:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(event=5Fqueue):=20=E4=BF=AE=E5=A4=8Dpeek?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E4=BA=8B=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改peek方法的实现,通过临时弹出并重新压入事件来确保正确查看环形缓冲区中的事件。使用临时vector保持事件顺序,并添加必要的互斥锁保护。 --- Extra2D/src/event/event_queue.cpp | 65 ++++++++++++++++++------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/Extra2D/src/event/event_queue.cpp b/Extra2D/src/event/event_queue.cpp index 2f7850d..8883fc1 100644 --- a/Extra2D/src/event/event_queue.cpp +++ b/Extra2D/src/event/event_queue.cpp @@ -1,45 +1,58 @@ #include +#include namespace extra2d { EventQueue::EventQueue() = default; -bool EventQueue::push(const Event &event) { - return buffer_.push(event); -} +bool EventQueue::push(const Event &event) { return buffer_.push(event); } -bool EventQueue::push(Event &&event) { - return buffer_.push(std::move(event)); -} +bool EventQueue::push(Event &&event) { return buffer_.push(std::move(event)); } -bool EventQueue::poll(Event &event) { - return buffer_.pop(event); -} +bool EventQueue::poll(Event &event) { return buffer_.pop(event); } bool EventQueue::peek(Event &event) const { - std::lock_guard lock(mutex_); - if (buffer_.empty()) { - return false; - } - // 环形缓冲区不支持peek,这里简化处理 - // 实际应用中可能需要双缓冲或其他机制 + std::lock_guard lock(mutex_); + if (buffer_.empty()) { return false; + } + // 临时弹出元素查看,然后再放回 + // 由于RingBuffer是无锁设计,这里使用互斥锁保护 + Event temp; + if (!const_cast &>(buffer_).pop(temp)) { + return false; + } + event = temp; + // 将元素重新压入队列(需要特殊处理顺序) + // 创建一个临时缓冲区来保持顺序 + std::vector tempBuffer; + tempBuffer.push_back(std::move(temp)); + + // 弹出所有元素 + Event e; + while (const_cast &>(buffer_).pop(e)) { + tempBuffer.push_back(std::move(e)); + } + + // 重新压入所有元素 + for (auto &item : tempBuffer) { + const_cast &>(buffer_).push( + std::move(item)); + } + + return true; } void EventQueue::clear() { - std::lock_guard lock(mutex_); - Event event; - while (buffer_.pop(event)) { - // 持续弹出直到为空 - } + std::lock_guard lock(mutex_); + Event event; + while (buffer_.pop(event)) { + // 持续弹出直到为空 + } } -bool EventQueue::empty() const { - return buffer_.empty(); -} +bool EventQueue::empty() const { return buffer_.empty(); } -size_t EventQueue::size() const { - return buffer_.size(); -} +size_t EventQueue::size() const { return buffer_.size(); } } // namespace extra2d