From 3f278a9fc078570997263aaf9ffe7e19093322c8 Mon Sep 17 00:00:00 2001 From: cxh Date: Fri, 14 Nov 2025 14:41:55 +0800 Subject: [PATCH] autoscan --- include/record_manager.hpp | 8 ++++++ src/record_manager.cpp | 56 ++++++++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/include/record_manager.hpp b/include/record_manager.hpp index 2dbc05e..5a21568 100644 --- a/include/record_manager.hpp +++ b/include/record_manager.hpp @@ -58,4 +58,12 @@ class RecordManager // 给一个 stream 的文件列表排序 void sortStream(const std::string& stream); + + // === 自动扫描线程 === + void startAutoScan(int interval_sec); + void stopAutoScan(); + + std::thread scan_thread_; + bool running_ = false; + int scan_interval_sec_ = 60; }; \ No newline at end of file diff --git a/src/record_manager.cpp b/src/record_manager.cpp index 54e9c05..66935c5 100644 --- a/src/record_manager.cpp +++ b/src/record_manager.cpp @@ -20,12 +20,15 @@ RecordManager::RecordManager(const std::string& srs_record_cfg_path) : srs_recor if (!ok) { LOG_ERROR("[RecordManager] Failed to load SRS config."); + return; } - else - { - LOG_INFO("[RecordManager] SRS config loaded. record_dir=" + record_dir_ + - ", dvr_duration=" + std::to_string(dvr_duration_sec_) + "s"); - } + + LOG_INFO("[RecordManager] SRS config loaded successfully."); + LOG_INFO("record_dir = " + record_dir_); + LOG_INFO("dvr_duration_sec = " + std::to_string(dvr_duration_sec_)); + + // 自动根据 dvr_duration 启动扫描线程 + startAutoScan(dvr_duration_sec_); } // @@ -84,6 +87,49 @@ bool RecordManager::loadSrsConfig() return true; } +void RecordManager::startAutoScan(int interval_sec) +{ + scan_interval_sec_ = interval_sec; // ← 保存扫描周期 + if (running_) return; + + running_ = true; + + scan_thread_ = std::thread( + [this]() + { + LOG_INFO("[RecordManager] Auto-scan thread started, interval = " + std::to_string(scan_interval_sec_) + + " seconds."); + + while (running_) + { + 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)); + } + + LOG_INFO("[RecordManager] Auto-scan thread stopped."); + }); +} + +void RecordManager::stopAutoScan() +{ + if (!running_) return; + + running_ = false; + if (scan_thread_.joinable()) scan_thread_.join(); + + LOG_INFO("[RecordManager] Auto-scan thread stopped."); +} + // // 扫描所有文件 //