|
@@ -96,6 +96,39 @@ void StreamScheduler::wait_for_completion() {
|
|
|
std::cout << "调度器已停止" << std::endl;
|
|
|
}
|
|
|
|
|
|
+bool StreamScheduler::reset_for_next_cycle() {
|
|
|
+ // 等待当前执行完成
|
|
|
+ if (is_running_.load()) {
|
|
|
+ wait_for_completion();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置所有任务状态
|
|
|
+ {
|
|
|
+ std::lock_guard<std::mutex> lock(tasks_mutex_);
|
|
|
+ for (auto& task : tasks_) {
|
|
|
+ task.started.store(false);
|
|
|
+ task.completed.store(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置调度器状态
|
|
|
+ should_stop_.store(false);
|
|
|
+ is_running_.store(false);
|
|
|
+
|
|
|
+ // 重置统计信息
|
|
|
+ {
|
|
|
+ std::lock_guard<std::mutex> lock(stats_mutex_);
|
|
|
+ scheduler_stats_.completed_tasks = 0;
|
|
|
+ scheduler_stats_.failed_tasks = 0;
|
|
|
+ scheduler_stats_.cancelled_tasks = 0;
|
|
|
+ scheduler_stats_.max_concurrent_used = 0;
|
|
|
+ scheduler_stats_.completion_rate = 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ std::cout << "调度器状态已重置,准备下一轮执行" << std::endl;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
std::vector<RTSPClientStats> StreamScheduler::get_all_stats() const {
|
|
|
std::vector<RTSPClientStats> all_stats;
|
|
|
|
|
@@ -200,7 +233,8 @@ void StreamScheduler::scheduler_main_loop() {
|
|
|
{
|
|
|
std::lock_guard<std::mutex> lock(tasks_mutex_);
|
|
|
for (auto& task : tasks_) {
|
|
|
- if (should_start_task(task)) {
|
|
|
+ if (!task.started.load() && should_start_task(task)) {
|
|
|
+ task.started.store(true);
|
|
|
tasks_to_start.push_back(std::make_shared<TaskInfo>(task));
|
|
|
}
|
|
|
}
|
|
@@ -232,10 +266,22 @@ void StreamScheduler::scheduler_main_loop() {
|
|
|
bool all_done = true;
|
|
|
{
|
|
|
std::lock_guard<std::mutex> lock(tasks_mutex_);
|
|
|
- for (const auto& task : tasks_) {
|
|
|
- if (task.client && task.client->is_running()) {
|
|
|
- all_done = false;
|
|
|
- break;
|
|
|
+ for (auto& task : tasks_) {
|
|
|
+ if (!task.completed.load()) {
|
|
|
+ // 检查是否已经启动但还在运行
|
|
|
+ if (task.started.load() && task.client && task.client->is_running()) {
|
|
|
+ all_done = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 检查是否还没有启动但应该启动
|
|
|
+ else if (!task.started.load() && should_start_task(task)) {
|
|
|
+ all_done = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 如果任务已经启动但不再运行,标记为完成
|
|
|
+ else if (task.started.load() && task.client && !task.client->is_running()) {
|
|
|
+ task.completed.store(true);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -265,6 +311,17 @@ void StreamScheduler::scheduler_main_loop() {
|
|
|
}
|
|
|
|
|
|
std::cout << "调度器主循环结束" << std::endl;
|
|
|
+
|
|
|
+ // 主循环结束后立即生成报告
|
|
|
+ if (report_callback_) {
|
|
|
+ std::cout << "主循环结束,自动生成报告..." << std::endl;
|
|
|
+ auto client_stats = get_all_stats();
|
|
|
+ auto scheduler_stats = get_scheduler_stats();
|
|
|
+ report_callback_(client_stats, scheduler_stats);
|
|
|
+ std::cout << "报告生成完成" << std::endl;
|
|
|
+ } else {
|
|
|
+ std::cout << "警告: 未设置报告回调,跳过报告生成" << std::endl;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void StreamScheduler::execute_task(std::shared_ptr<TaskInfo> task) {
|
|
@@ -276,6 +333,7 @@ void StreamScheduler::execute_task(std::shared_ptr<TaskInfo> task) {
|
|
|
|
|
|
if (should_stop_.load()) {
|
|
|
std::cout << "任务 " << task->stream_index << " 被取消" << std::endl;
|
|
|
+ task->completed.store(true);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -288,6 +346,9 @@ void StreamScheduler::execute_task(std::shared_ptr<TaskInfo> task) {
|
|
|
|
|
|
std::cout << "任务 " << task->stream_index << " 完成,状态: "
|
|
|
<< (success ? "成功" : "失败") << std::endl;
|
|
|
+
|
|
|
+ // 标记任务完成
|
|
|
+ task->completed.store(true);
|
|
|
|
|
|
} catch (const std::exception& e) {
|
|
|
std::cerr << "执行任务 " << task->stream_index << " 时发生异常: " << e.what() << std::endl;
|
|
@@ -298,6 +359,9 @@ void StreamScheduler::execute_task(std::shared_ptr<TaskInfo> task) {
|
|
|
error_stats.status = RTSPClientStatus::ERROR_RECORD;
|
|
|
error_stats.error_message = e.what();
|
|
|
task_completion_callback(task->stream_index, error_stats);
|
|
|
+
|
|
|
+ // 标记任务完成
|
|
|
+ task->completed.store(true);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -306,11 +370,6 @@ bool StreamScheduler::should_start_task(const TaskInfo& task) const {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- // 检查客户端是否已经在运行
|
|
|
- if (task.client->is_running()) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
// 检查是否到了开始时间
|
|
|
auto current_time = std::chrono::system_clock::now();
|
|
|
auto elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(
|
|
@@ -350,21 +409,26 @@ void StreamScheduler::update_stats() {
|
|
|
current_concurrent++;
|
|
|
}
|
|
|
|
|
|
- auto status = task.client ? task.client->get_status() : RTSPClientStatus::IDLE;
|
|
|
- switch (status) {
|
|
|
- case RTSPClientStatus::FINISHED:
|
|
|
- completed++;
|
|
|
- break;
|
|
|
- case RTSPClientStatus::ERROR_CONNECT:
|
|
|
- case RTSPClientStatus::ERROR_RECORD:
|
|
|
- case RTSPClientStatus::TIMEOUT:
|
|
|
- failed++;
|
|
|
- break;
|
|
|
- case RTSPClientStatus::CANCELLED:
|
|
|
- cancelled++;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ if (task.completed.load()) {
|
|
|
+ auto status = task.client ? task.client->get_status() : RTSPClientStatus::IDLE;
|
|
|
+ switch (status) {
|
|
|
+ case RTSPClientStatus::FINISHED:
|
|
|
+ completed++;
|
|
|
+ break;
|
|
|
+ case RTSPClientStatus::ERROR_CONNECT:
|
|
|
+ case RTSPClientStatus::ERROR_RECORD:
|
|
|
+ case RTSPClientStatus::TIMEOUT:
|
|
|
+ case RTSPClientStatus::STREAM_UNAVAILABLE:
|
|
|
+ failed++;
|
|
|
+ break;
|
|
|
+ case RTSPClientStatus::CANCELLED:
|
|
|
+ cancelled++;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ // 如果状态不明确但已经完成,认为成功
|
|
|
+ completed++;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -395,6 +459,9 @@ void StreamScheduler::task_completion_callback(int stream_index, const RTSPClien
|
|
|
std::cout << "成功 (接收 " << stats.frames_received << " 帧, "
|
|
|
<< stats.bytes_received << " 字节)";
|
|
|
break;
|
|
|
+ case RTSPClientStatus::STREAM_UNAVAILABLE:
|
|
|
+ std::cout << "流不可用(快速棄用): " << stats.error_message;
|
|
|
+ break;
|
|
|
case RTSPClientStatus::ERROR_CONNECT:
|
|
|
std::cout << "连接错误: " << stats.error_message;
|
|
|
break;
|