//分配小車 AGVScheduler scheduler; scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務 // 遍历所有 AGV,更新位置和状态 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) { moveAgvs(i); std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl; } },,修改爲,使用多綫程去設置agv運行
时间: 2024-03-05 13:50:26 浏览: 100
可以将原来的遍历所有 AGV 的代码封装在一个函数中,然后使用多线程去调用这个函数。具体实现方法如下:
1. 将分配小车的代码和遍历所有 AGV 的代码分别放在两个函数中。
```c++
void assignAgv(std::vector<Task>& tasks, std::vector<Agv>& agvs) {
AGVScheduler scheduler;
scheduler.assign_task_to_agv(tasks, agvs); // 开始分配任务
}
void updateAgv(std::vector<Agv>& agvs, int i) {
if (agvs[i].available_ == 0 && agvs[i].run_ == 0) {
moveAgvs(i);
std::cout << "agv.id:" << agvs[i].id_ << "___task.id :" << agvs[i].task_id << std::endl;
}
}
```
2. 使用多线程去调用这两个函数,可以使用 C++11 中的 `std::thread` 类,代码如下:
```c++
std::vector<std::thread> threads;
threads.push_back(std::thread(&assignAgv, std::ref(tasks), std::ref(agvs))); // 分配小车
for (int i = 0; i < agvs.size(); i++) {
threads.push_back(std::thread(&updateAgv, std::ref(agvs), i)); // 更新 AGV
}
for (auto& t : threads) {
t.join();
}
```
这段代码会创建一个线程池,首先创建一个线程去调用 `assignAgv` 函数分配小车,然后遍历所有 AGV,为每个 AGV 创建一个线程去调用 `updateAgv` 函数更新 AGV。最后使用 `join` 函数等待所有线程执行完毕。
注意:由于多线程会同时访问 AGV 和 Task 数据,需要对它们进行加锁保护,避免出现不可预测的结果。
阅读全文