This commit is contained in:
cxh 2025-11-14 18:33:35 +08:00
parent dcb5978274
commit 5d4f895a34
3 changed files with 21 additions and 6 deletions

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <atomic>
#include <chrono> #include <chrono>
#include <filesystem> #include <filesystem>
#include <string> #include <string>
@ -72,7 +73,7 @@ class RecordManager
void stopAutoScan(); void stopAutoScan();
std::thread scan_thread_; std::thread scan_thread_;
bool running_ = false; std::atomic<bool> running_{false};
int scan_interval_sec_ = 60; int scan_interval_sec_ = 60;
}; };

View File

@ -79,6 +79,14 @@ int main()
// ---------- 退出清理 ---------- // ---------- 退出清理 ----------
LOG_INFO("[MAIN] Shutdown requested. Stopping RTMP streams..."); 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(); RTMPManager::stop_all();
if (mqtt_thread.joinable()) if (mqtt_thread.joinable())

View File

@ -123,10 +123,10 @@ bool RecordManager::loadSrsConfig()
void RecordManager::startAutoScan(int interval_sec) void RecordManager::startAutoScan(int interval_sec)
{ {
scan_interval_sec_ = interval_sec; // ← 保存扫描周期 scan_interval_sec_ = interval_sec;
if (running_) return; if (running_) return;
running_ = true; running_.store(true);
scan_thread_ = std::thread( scan_thread_ = std::thread(
[this]() [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_) + LOG_INFO("[RecordManager] Auto-scan thread started, interval = " + std::to_string(scan_interval_sec_) +
" seconds."); " seconds.");
while (running_) while (running_.load() && g_running.load())
{ {
auto t0 = std::chrono::steady_clock::now(); auto t0 = std::chrono::steady_clock::now();
this->scanAll(); this->scanAll();
LOG_INFO("[RecordManager] scanAll() completed."); LOG_INFO("[RecordManager] scanAll() completed.");
// 休眠剩余时间 // 休眠剩余时间(支持快速退出)
auto t1 = std::chrono::steady_clock::now(); auto t1 = std::chrono::steady_clock::now();
auto used_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t1 - t0).count(); auto used_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t1 - t0).count();
int sleep_ms = scan_interval_sec_ * 1000 - used_ms; int sleep_ms = scan_interval_sec_ * 1000 - used_ms;
if (sleep_ms < 100) sleep_ms = 100; 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."); LOG_INFO("[RecordManager] Auto-scan thread stopped.");