From c7d47405edab23bd4062e4f93fceb1d2a30b0321 Mon Sep 17 00:00:00 2001 From: cxh Date: Mon, 5 Jan 2026 09:03:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BA=BF=E7=A8=8B=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=AD=A3=E5=B8=B8=E7=BB=93=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/serial_port.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/serial_port.cpp b/src/serial_port.cpp index 5d133d7..4f9a2fb 100644 --- a/src/serial_port.cpp +++ b/src/serial_port.cpp @@ -50,11 +50,11 @@ void SerialPort::stop() stop_flag_ = true; running_ = false; - if (reader_thread_.joinable()) reader_thread_.join(); - - if (reconnect_thread_.joinable()) reconnect_thread_.join(); - + // 先关闭 fd,打断 reader 的阻塞 read() close_port(); + + if (reader_thread_.joinable()) reader_thread_.join(); + if (reconnect_thread_.joinable()) reconnect_thread_.join(); } bool SerialPort::open_port() @@ -138,6 +138,13 @@ void SerialPort::reader_loop() running_ = false; } +static void interruptible_sleep(std::atomic& stop_flag, int seconds) +{ + using namespace std::chrono; + for (int i = 0; i < seconds * 10 && !stop_flag.load(std::memory_order_relaxed); ++i) + std::this_thread::sleep_for(100ms); +} + void SerialPort::reconnect_loop() { int current_interval = retry_interval_; @@ -159,7 +166,7 @@ void SerialPort::reconnect_loop() { LOG_INFO("[" + id_ + "] Connect failed, retry in " + std::to_string(current_interval) + "s"); - std::this_thread::sleep_for(std::chrono::seconds(current_interval)); + interruptible_sleep(stop_flag_, current_interval); current_interval = std::min(current_interval * 2, max_interval); } }