AGVScheduler scheduler; std::vector<std::thread> threads; scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務 for (int i = 0; i < agvs.size(); i++) { threads.push_back(std::thread(&MainWindow::moveAgvs, this, i)); } for (auto& t : threads) { t.join(); },爲什麽agv會卡住不動
时间: 2024-04-27 21:20:56 浏览: 14
根据你提供的代码,可能的原因如下:
1. `assign_task_to_agv` 方法有可能分配了一个空的任务给某个AGV,导致该AGV一直处于等待任务的状态,从而卡住不动。请检查分配任务的代码,确保每个AGV都被分配到了非空的任务。
2. `moveAgvs` 方法有可能存在死循环或者阻塞操作,导致线程一直卡在该方法中,从而无法继续执行下去。请检查 `moveAgvs` 方法的代码,确保其中没有死循环或者阻塞操作。
3. 另一种可能是由于多线程并发操作导致的问题。你可以尝试使用锁来保护共享资源,避免多个线程同时访问同一个AGV,导致数据混乱。
希望以上信息能够帮助你找到问题所在。
相关问题
//分配小車 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運行
可以将原来的遍历所有 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 数据,需要对它们进行加锁保护,避免出现不可预测的结果。
AGVScheduler scheduler; scheduler.assign_task_to_agv(tasks, agvs); for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == false) { moveAgvs(i); } },添加代碼,一直在觸發
在上面的代码中加入一个 while 循环,使得程序一直运行,直到所有任务都被分配完成。代码如下所示:
```
AGVScheduler scheduler;
scheduler.assign_task_to_agv(tasks, agvs);
while (!scheduler.all_tasks_assigned()) {
for (int i = 0; i < agvs.size(); i++) {
if (agvs[i].available_ == false) {
moveAgvs(i);
}
}
}
```
其中,all_tasks_assigned() 函数用于判断是否所有任务都已经被分配完成。这样程序就会一直运行,直到所有任务都被分配完成。