if (tasks[completed_task_index].Task_type == 1) { // 如果是充电任务 if (agvs[i].current_x == agvs[i].end_x_ && agvs[i].current_y == agvs[i].end_y_ ) { // 如果到达充电站 if (agvs[i].battery_ < 100) { std::thread charge_thread([&]() { agv_charge(i); moveAgvs(i); // 新增代码:线程运行结束时触发 moveAgvs(i) 函数 }); charge_thread.detach(); },ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 0x0x1e6d4cb6410. Receiver '' (of type 'QTextDocument') was created in thread
时间: 2024-02-14 12:06:31 浏览: 59
这个错误和你之前提到的那个错误是不同的。这个错误发生在QCoreApplication中,具体原因可能是你在某个QObject对象的析构函数中,尝试向该对象关联的QCoreApplication对象发送事件,但是该QObject对象已经被销毁,导致了这个错误。
解决这个问题的方法是,确保所有的QObject对象都被正确地销毁,不要在析构函数中发送事件。具体地,你可以采用以下几种方式来避免这个问题:
1. 在QObject对象的析构函数中,将该对象从信号槽(signal-slot)连接中断开,并且将该对象从父对象(parent object)中移除:
```c++
MyObject::~MyObject()
{
disconnect(this, nullptr, nullptr, nullptr);
setParent(nullptr);
}
```
2. 在QObject对象的析构函数中,将该对象移动到新线程中,然后在新线程中销毁该对象:
```c++
MyObject::~MyObject()
{
moveToThread(QCoreApplication::instance()->thread());
QTimer::singleShot(0, this, &QObject::deleteLater);
}
```
其中,QTimer::singleShot(0, this, &QObject::deleteLater)表示在0毫秒后,将该对象的deleteLater()槽函数添加到事件队列中,用于在新线程中销毁该对象。
需要注意的是,在多线程编程中,正确地管理QObject对象的生命周期是非常重要的。如果某个QObject对象已经被销毁,但是仍然被其他QObject对象引用,就有可能导致这种错误的发生。因此,在编写多线程程序时,一定要仔细地管理QObject对象的生命周期,避免出现这种问题。
阅读全文