Пользовательский модуль с использованием veins и omnet

#omnet #veins

#omnet #veins

Вопрос:

Я установил veins 4.7 и прошел через руководство. Все работает. Теперь я создал новый модуль, больше похожий на DemoBaseApplLayer. Этот модуль наследуется от BaseAppLayer. В методе инициализации я вызываю функцию dispatchMsg. который выглядит следующим образом:

Основываясь на нескольких ответах, я ввел cancelAndDelete (msg) в метод деструктора и завершения. Я также добавил метод delete (msg), но безрезультатно

 dispatchMsg() {

//SignedBSMMessage sgndBSMMsg(location);
char* inputData = signedBSMMessage.CreateBSMMessage(to_CharPtr(this->curPosition.x),
                                                        to_CharPtr(this->curPosition.y),
                                                        to_CharPtr(this->curSpeed.z ),
                                                        to_CharPtr(this->curDirection.z));
cout << "Start dispatchMsg" << endl;

ObuSigndBSM obuSigndBSM("BasicSafetyMessage", 01);
obuSigndBSM.setSignedBsm(inputData);
obuSigndBSM.setMsgLength(signedBSMMessage.getLength());
Coord pos;
traci->getRoadMapPos(pos);
string laneId = std::to_string(pos.z);
obuSigndBSM.setLandId(laneId.c_str());

 bsmMessage=amp;obuSigndBSM;
this->sendDown(bsmMessage);
//delete bsmMessage;
cout << "End dispatchMsg" << endl;
EV_DEBUG << "BSMApp::dispatchMsg end " ;
delete(bsmMessage);

}
  

Тем не менее, я продолжаю получать это исключение:

В настоящее время выполняется моделирование базового объекта Safetymessage (omnetpp::cEventHeap).запланированные события, его нельзя удалить.

Если эта ошибка возникает внутри omnetpp::cEventHeap, ее необходимо изменить на вызов drop (), прежде чем он сможет удалить этот объект.

Если эта ошибка возникает внутри деструктора omnetpp::cEventHeap и базовое сообщение о безопасности является членом класса,

omnetpp::cEventHeap необходимо вызвать drop() в деструкторе — в модуле (Veins::BSMApp) OBUScenerio.node[0].appl (id =7), при t = 1s, событие # 2

чего мне не хватает? мы будем признательны за ваш любезный ответ.

Ответ №1:

После вызова this-> sendDown(bsmMessage) рассмотрим указатель, принадлежащий ядру моделирования OMNeT . Не вызывайте delete(bsmMessage) после вызова этого метода — в противном случае вы удалите событие (подумайте: всю информацию о фрейме, который вы хотите отправить), пока OMNeT доставляет его.

Удаляйте только указатели на данные, которые вам предоставил OMNeT (например, как событие для получения данных), то есть в методе, который обрабатывает полученные кадры.