//模擬小車行駛 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 11:48:56 浏览: 111
agvs仓储机器人检测数据集VOC+YOLO格式967张3类别.7z
这段代码中使用了QTimer::singleShot()来控制小车的移动,但是使用QTimer::singleShot()时需要注意,它是一个异步操作,会放在事件队列中等待执行,如果在执行singleShot()之前就有其他的事件被放入队列中,那么这些事件就会先于singleShot()执行,从而导致程序卡死。
为了避免这种情况,可以采用以下两种方法之一:
1. 将整个for循环放在一个单独的线程中运行,这样就不会影响主线程的事件队列。
2. 使用QTimer来定时执行下一步操作,而不是使用QTimer::singleShot()。具体实现方法如下:
```c++
// 在构造函数中初始化timer
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(moveAGVs()));
timer->start(100); // 每100ms执行一次moveAGVs()
// moveAGVs()函数中只处理小车移动的逻辑
void MainWindow::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;
// 计算下一步的位置
float dx = (next_node->x - agvs[i].getCurrentX()) * speed / distance;
float dy = (next_node->y - agvs[i].getCurrentY()) * speed / distance;
float new_x = agvs[i].getCurrentX() + dx;
float new_y = agvs[i].getCurrentY() + dy;
// 判断是否到达下一个节点
if (dx * (next_node->x - agvs[i].getCurrentX()) <= 0 && dy * (next_node->y - agvs[i].getCurrentY()) <= 0) {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
paths[i].erase(paths[i].begin());
} else {
agvs[i].setCurrentX(new_x);
agvs[i].setCurrentY(new_y);
}
// 绘制小车和路径
QPainter painter1(this);
painter1.drawLine(agvs[i].getCurrentX(), agvs[i].getCurrentY(), paths[i][0]->x, paths[i][0]->y);
this->update();
}
}
}
```
以上代码中,我们在构造函数中初始化了一个QTimer,并设置了每100ms执行一次moveAGVs()函数。在moveAGVs()函数中,我们计算小车移动的下一个位置,并判断是否到达下一个节点,如果到达下一个节点,则从路径中删除该节点。最后,我们在moveAGVs()函数中绘制小车和路径,并调用update()函数更新界面。
阅读全文