//模擬小車行駛 for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); //std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; if (! paths[i].empty()) { QPainter painter1(this); painter1.drawLine(agvs[i].getCurrentX(), agvs[i].getCurrentY(), paths[i][0]->x, paths[i][0]->y); } this->update(); }); } },一運行就卡死,怎麽修改
时间: 2023-11-28 22:48:47 浏览: 36
这段代码里使用了 QTimers 单独执行每个 AGV 的路径规划和行驶模拟。如果你同时启动了多个 QTimer,可能会导致程序卡死。为了避免这种情况发生,你可以使用一个 QTimer 来控制所有 AGV 的行驶,而不是为每个 AGV 都创建一个 QTimer。
在你的类中定义一个 QTimer,例如:
```
QTimer* timer;
```
在你的构造函数中初始化这个 QTimer,例如:
```
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(moveAgvs()));
timer->start(100); // 每 100 毫秒更新一次 AGVs 的位置
```
然后,你需要实现一个名为 moveAgvs() 的槽函数来更新 AGVs 的位置。在这个函数中,你可以遍历所有 AGVs,根据它们的速度和时间更新它们的位置。例如:
```
void YourClass::moveAgvs()
{
for (int i = 0; i < agvs.size(); i++) {
if (! paths[i].empty()) {
Node* next_node = paths[i][0];
float speed = agvs[i].getSpeed();
float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2));
float time = distance / speed * 1000;
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
if (! paths[i].empty()) {
QPainter painter1(this);
painter1.drawLine(agvs[i].getCurrentX(), agvs[i].getCurrentY(), paths[i][0]->x, paths[i][0]->y);
}
this->update();
}
}
}
```
请注意,这个函数不再使用 QTimer 单独执行每个 AGV 的路径规划和行驶模拟。相反,它使用一个 QTimer 来控制所有 AGV 的行驶,并在每次更新时遍历所有 AGVs 更新它们的位置和绘制。
阅读全文
相关推荐













