From 87fb647c36e9f10eb71983b23b503da1d9aa2eea Mon Sep 17 00:00:00 2001 From: TY <1431301249@qq.com> Date: Fri, 9 Jan 2026 12:12:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20src/dispatch/advanced=5Fdi?= =?UTF-8?q?spatcher.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dispatch/advanced_dispatcher.cpp | 254 +++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 src/dispatch/advanced_dispatcher.cpp diff --git a/src/dispatch/advanced_dispatcher.cpp b/src/dispatch/advanced_dispatcher.cpp new file mode 100644 index 0000000..0337551 --- /dev/null +++ b/src/dispatch/advanced_dispatcher.cpp @@ -0,0 +1,254 @@ +#include "advanced_dispatcher.h" +#include +#include + +AdvancedDispatcher::AdvancedDispatcher(GraphMap* map, ResourceManager* resource_manager) + : graph_map_(map) + , resource_manager_(resource_manager) + , agv_manager_(nullptr) + , state_(DispatcherState::STOPPED) + , should_stop_(false) + , dispatch_interval_ms_(1000) { +} + +AdvancedDispatcher::AdvancedDispatcher(GraphMap* map, ResourceManager* resource_manager, AGVManagerBase* agv_manager) + : graph_map_(map) + , resource_manager_(resource_manager) + , agv_manager_(agv_manager) + , state_(DispatcherState::STOPPED) + , should_stop_(false) + , dispatch_interval_ms_(1000) { +} + +AdvancedDispatcher::~AdvancedDispatcher() { + stop(); +} + +bool AdvancedDispatcher::start() { + if (state_.load() == DispatcherState::RUNNING) { + return true; + } + + should_stop_.store(false); + state_.store(DispatcherState::RUNNING); + + // 启动调度线程 + dispatch_thread_ = std::thread(&AdvancedDispatcher::dispatchLoop, this); + + std::cout << "[调度器] 高级调度器已启动" << std::endl; + return true; +} + +void AdvancedDispatcher::stop() { + if (state_.load() == DispatcherState::STOPPED) { + return; + } + + should_stop_.store(true); + state_.store(DispatcherState::STOPPED); + + // 等待线程结束 + if (dispatch_thread_.joinable()) { + dispatch_thread_.join(); + } + + std::cout << "[调度器] 高级调度器已停止" << std::endl; +} + +void AdvancedDispatcher::pause() { + if (state_.load() == DispatcherState::RUNNING) { + state_.store(DispatcherState::PAUSED); + std::cout << "[调度器] 调度器已暂停" << std::endl; + } +} + +void AdvancedDispatcher::resume() { + if (state_.load() == DispatcherState::PAUSED) { + state_.store(DispatcherState::RUNNING); + std::cout << "[调度器] 调度器已恢复" << std::endl; + } +} + +bool AdvancedDispatcher::addTask(int task_id, int start_point_id, int end_point_id, + const std::string& description, int priority) { + std::lock_guard lock(task_mutex_); + + // 检查任务是否已存在 + for (const auto& task : task_queue_) { + if (task->id == task_id) { + std::cout << "[调度器] 任务 " << task_id << " 已存在" << std::endl; + return false; + } + } + + // 创建新任务 + Point* start_point = graph_map_->getPointById(start_point_id); + Point* end_point = graph_map_->getPointById(end_point_id); + + if (!start_point || !end_point) { + std::cout << "[调度器] 错误: 任务 " << task_id << " 的节点不存在" << std::endl; + return false; + } + + auto task = std::make_unique(task_id, priority, start_point, end_point, description); + task_queue_.push_back(std::move(task)); + + statistics_.total_tasks++; + + std::cout << "[调度器] 添加任务 " << task_id << ": " << description << std::endl; + return true; +} + +bool AdvancedDispatcher::cancelTask(int task_id) { + std::lock_guard lock(task_mutex_); + + for (auto it = task_queue_.begin(); it != task_queue_.end(); ++it) { + if ((*it)->id == task_id) { + (*it)->status = TaskStatus::FAILED; + std::cout << "[调度器] 取消任务 " << task_id << std::endl; + return true; + } + } + + return false; +} + +void AdvancedDispatcher::onTaskStarted(int task_id, int agv_id) { + std::lock_guard lock(task_mutex_); + + for (const auto& task : task_queue_) { + if (task->id == task_id) { + task->status = TaskStatus::IN_PROGRESS; + std::cout << "[调度器] 任务 " << task_id << " 开始执行 (AGV-" << agv_id << ")" << std::endl; + break; + } + } +} + +void AdvancedDispatcher::onTaskCompleted(int task_id, int agv_id, bool success) { + std::lock_guard lock(task_mutex_); + + for (const auto& task : task_queue_) { + if (task->id == task_id) { + task->status = success ? TaskStatus::COMPLETED : TaskStatus::FAILED; + + if (success) { + statistics_.completed_tasks++; + std::cout << "[调度器] 任务 " << task_id << " 完成成功 (AGV-" << agv_id << ")" << std::endl; + } else { + statistics_.failed_tasks++; + std::cout << "[调度器] 任务 " << task_id << " 执行失败 (AGV-" << agv_id << ")" << std::endl; + } + break; + } + } +} + +DispatcherStatistics AdvancedDispatcher::getStatistics() { + updateStatistics(); + return statistics_; +} + +void AdvancedDispatcher::printSystemStatus() const { + std::lock_guard lock(dispatcher_mutex_); + + std::cout << "\n===== 调度器状态 =====" << std::endl; + + // 调度器状态 + std::string state_str; + switch (state_.load()) { + case DispatcherState::STOPPED: state_str = "已停止"; break; + case DispatcherState::RUNNING: state_str = "运行中"; break; + case DispatcherState::PAUSED: state_str = "已暂停"; break; + } + std::cout << "调度器状态: " << state_str << std::endl; + + // 任务统计 + std::cout << "任务统计: 总数 " << statistics_.total_tasks + << ", 完成 " << statistics_.completed_tasks + << ", 失败 " << statistics_.failed_tasks << std::endl; + + // 活跃AGV数量 + std::cout << "活跃AGV数量: " << statistics_.active_agvs << std::endl; + + // 任务队列状态 + { + std::lock_guard task_lock(task_mutex_); + size_t pending_count = 0; + size_t executing_count = 0; + size_t completed_count = 0; + + for (const auto& task : task_queue_) { + switch (task->status) { + case TaskStatus::PENDING: pending_count++; break; + case TaskStatus::IN_PROGRESS: executing_count++; break; + case TaskStatus::COMPLETED: completed_count++; break; + default: break; + } + } + + std::cout << "任务队列: 待处理 " << pending_count + << ", 执行中 " << executing_count + << ", 已完成 " << completed_count << std::endl; + } + + std::cout << "====================" << std::endl; +} + +void AdvancedDispatcher::dispatchLoop() { + while (!should_stop_.load()) { + if (state_.load() == DispatcherState::RUNNING) { + performDispatch(); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(dispatch_interval_ms_)); + } +} + +void AdvancedDispatcher::performDispatch() { + // 如果有AGV管理器,使用其分配功能 + if (agv_manager_) { + agv_manager_->assignTasks(); + } else { + // 简化的调度逻辑 + std::lock_guard task_lock(task_mutex_); + + for (const auto& task : task_queue_) { + if (task->status == TaskStatus::PENDING) { + // 简单地将任务状态设为进行中(实际实现中需要分配给AGV) + task->status = TaskStatus::IN_PROGRESS; + std::cout << "[调度器] 分配任务 " << task->id << " (简化调度)" << std::endl; + break; + } + } + } +} + +bool AdvancedDispatcher::assignTaskToAGV(Task* task, AGV* agv) { + if (!task || !agv || agv->state != AGVState::IDLE) { + return false; + } + + // 设置任务分配 + agv->current_task = task; + agv->state = AGVState::ASSIGNED; + task->status = TaskStatus::ASSIGNED; + task->assigned_agv = agv; + + return true; +} + +void AdvancedDispatcher::updateStatistics() { + std::lock_guard lock(dispatcher_mutex_); + + // 更新活跃AGV数量 + if (agv_manager_) { + auto all_agvs = agv_manager_->getAllAGVs(); + statistics_.active_agvs = 0; + for (AGV* agv : all_agvs) { + if (agv->state != AGVState::IDLE) { + statistics_.active_agvs++; + } + } + } +} \ No newline at end of file