From 5d4f895a341196fe4c8dead83f716039d4f3583b Mon Sep 17 00:00:00 2001 From: cxh Date: Fri, 14 Nov 2025 18:33:35 +0800 Subject: [PATCH] 1 --- include/record_manager.hpp | 3 ++- src/main.cpp | 8 ++++++++ src/record_manager.cpp | 16 +++++++++++----- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/record_manager.hpp b/include/record_manager.hpp index 067ff3d..a490da0 100644 --- a/include/record_manager.hpp +++ b/include/record_manager.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -72,7 +73,7 @@ class RecordManager void stopAutoScan(); std::thread scan_thread_; - bool running_ = false; + std::atomic running_{false}; int scan_interval_sec_ = 60; }; diff --git a/src/main.cpp b/src/main.cpp index 98c853c..d124d5c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,6 +79,14 @@ int main() // ---------- 退出清理 ---------- LOG_INFO("[MAIN] Shutdown requested. Stopping RTMP streams..."); + + // 1) 停止 RecordManager 自动扫描线程 + if (g_record_manager) + { + g_record_manager->stopAutoScan(); + LOG_INFO("[MAIN] RecordManager auto-scan stopped."); + } + RTMPManager::stop_all(); if (mqtt_thread.joinable()) diff --git a/src/record_manager.cpp b/src/record_manager.cpp index 035c67a..4800549 100644 --- a/src/record_manager.cpp +++ b/src/record_manager.cpp @@ -123,10 +123,10 @@ bool RecordManager::loadSrsConfig() void RecordManager::startAutoScan(int interval_sec) { - scan_interval_sec_ = interval_sec; // ← 保存扫描周期 + scan_interval_sec_ = interval_sec; if (running_) return; - running_ = true; + running_.store(true); scan_thread_ = std::thread( [this]() @@ -134,20 +134,26 @@ void RecordManager::startAutoScan(int interval_sec) LOG_INFO("[RecordManager] Auto-scan thread started, interval = " + std::to_string(scan_interval_sec_) + " seconds."); - while (running_) + while (running_.load() && g_running.load()) { auto t0 = std::chrono::steady_clock::now(); this->scanAll(); LOG_INFO("[RecordManager] scanAll() completed."); - // 休眠剩余时间 + // 休眠剩余时间(支持快速退出) auto t1 = std::chrono::steady_clock::now(); auto used_ms = std::chrono::duration_cast(t1 - t0).count(); int sleep_ms = scan_interval_sec_ * 1000 - used_ms; if (sleep_ms < 100) sleep_ms = 100; - std::this_thread::sleep_for(std::chrono::milliseconds(sleep_ms)); + int remain = sleep_ms; + while (remain > 0 && running_.load() && g_running.load()) + { + int chunk = std::min(remain, 200); + std::this_thread::sleep_for(std::chrono::milliseconds(chunk)); + remain -= chunk; + } } LOG_INFO("[RecordManager] Auto-scan thread stopped.");