diff --git a/src/main.cpp b/src/main.cpp index 33aeb30..b28d89e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,7 +17,8 @@ void signalHandler(int signum) int main() { - signal(SIGINT, signalHandler); + signal(SIGINT, [](int) + { g_running = false; RTSPManager::stop(); }); signal(SIGPIPE, SIG_IGN); // 初始化日志文件 @@ -34,17 +35,19 @@ int main() return -1; } - // 启动 RTSP - RTSPManager::init(); std::thread rtsp_thread([&]() { RTSPManager::start(g_app_config.cameras); }); - - // 启动 MQTT 客户端线程 std::thread mqtt_thread(mqtt_client_thread_func); // 等待退出信号 - rtsp_thread.join(); - mqtt_thread.join(); + while (g_running) + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + + // 等待退出信号 + if (rtsp_thread.joinable()) + rtsp_thread.join(); + if (mqtt_thread.joinable()) + mqtt_thread.join(); LOG_INFO("[MAIN] Program exited cleanly."); return 0; diff --git a/src/rtsp_manager.cpp b/src/rtsp_manager.cpp index 914a06c..81ecc97 100644 --- a/src/rtsp_manager.cpp +++ b/src/rtsp_manager.cpp @@ -54,25 +54,30 @@ void RTSPManager::start(const std::vector &cameras) LOG_INFO("[RTSP] Server running on rtsp://localhost:8554"); g_main_loop_run(loop); + + // loop 退出后再释放资源 + if (server) + { + g_object_unref(server); + server = nullptr; + } + if (loop) + { + g_main_loop_unref(loop); + loop = nullptr; + } + LOG_INFO("[RTSP] Server stopped."); } void RTSPManager::stop() { if (loop) { - // 在 loop 所在线程安全退出 + // 仅退出 loop,不 unref server g_main_context_invoke(nullptr, [](gpointer data) -> gboolean { - GMainLoop *loop = static_cast(data); + GMainLoop *loop = static_cast(data); g_main_loop_quit(loop); return G_SOURCE_REMOVE; }, loop); } - - if (server) - { - g_object_unref(server); - server = nullptr; - } - - LOG_INFO("[RTSP] Server stopped."); }