Die Simulation läuft aber in der Konsole habe ich diesen Hinweis.omnet ++: Selbstnachricht als entsorgtes Objekt
undisposed Objekt: (omnetpp :: cMessage) Mysimulation.Switch4.eth [2] .queue.scheduler.IntervalTimemsg - prüfen Modul destructor undisposed Objekt: (omnetpp :: cMessage) Mysimulation.Switch5. eth [1] .queue.scheduler.IntervalTimemsg - prüfen Modul destructor
Eigentlich ist es ein Modul, das ich habe zwei Zeitnachricht über und über durch die Simulation erstellt werden. Ich habe online gelesen und festgestellt, dass dieser Fehler mit dem Erstellen von Objekten zusammenhängt, die zum Zeitpunkt des Löschens nicht gelöscht wurden.
void PriorityScheduler::initialize() {
gateCycleTimemsg = new cMessage("gateCycleTimemsg");
scheduleAt(baseTime , gateCycleTimemsg);
// baseTime = 2s
}
void PriorityScheduler::handleMessage(cMessage *msg) {
if (msg == gateCycleTimemsg) {
if (currentList == (lastIntervalTime)) {
delete msg;
gateCycleTimemsg = new cMessage("gateCycleTimemsg");
scheduleAt(simTime() + gateCycleTime , gateCycleTimemsg);
...
IntervalTimemsg = new cMessage("IntervalTimemsg");
scheduleAt(simTime() + Interval , IntervalTimemsg);
}
else if (currentList == (firstIntervalTime)) {
gateCycleTimemsg = msg; // same message reused
scheduleAt(simTime() + gateCycleTime , gateCycleTimemsg);
//gateCycleTime = 10 seconds
...
IntervalTimemsg = new cMessage("IntervalTimemsg");
scheduleAt(simTime() + Interval , IntervalTimemsg);
// Interval = 1s
}
}
else if (msg == IntervalTimemsg) {
if (currentList == (lastIntervalTime));
else{
IntervalTimemsg = msg;
scheduleAt(simTime() + Interval , IntervalTimemsg);
}
}
Plugin Pfad: /home/amr/omnetpp-5.0/samples/etc/plugins;./plugins nach dem Werfen einer Instanz 'omnetpp :: cRuntimeError' was() aufgerufen terminate: Object pk-56-145 ist derzeit in (omnetpp :: cEventHeap) simulation.scheduled-events, es kann nicht gelöscht werden. Wenn dieser Fehler innerhalb von omnetpp :: cEventHeap auftritt, muss er geändert werden, um drop() aufzurufen, bevor das Objekt gelöscht werden kann. Wenn dies Fehler innerhalb omnetpp auftritt :: cEventHeap Destruktor und pk-56-145 ist ein Klassenmitglied, omnetpp :: cEventHeap muss Drop() aufzurufen, in dem destructor
ich einen Konstruktor erstellt sowie Destruktor. Ich habe auch die Funktion finish() erstellt, nachdem ich online nach Lösungen gelesen habe. Trotzdem hat es das nicht gelöst.
Ich entfernte auch jede Nachricht erhalten und erstellt eine neue beim Senden, aber es hat nichts geändert.
bearbeiten: Ich bearbeitet die Codierung mit löschen msg; Ich fügte hinzu, und gab ein Beispiel von Timings und hinzugefügt, um das unten Teil,
BaseTime ‚BT‘, gateCycleTime ‚CT‘, Intervall ‚IT‘
----> BT
<---- IT1 ----> <----- IT2 ----> .........<-------- ITx -------->
<------------------------------ CT ----------------------------->
habe ich die gleiche Nachricht für BT und CT, während ein anderer Nachricht für ITs, da ich das Timing der letzten IT 'ITx' nicht kenne.
Nun, ich lese das Dokument und ich kann es immer noch nicht lösen. Das Problem, dass ich zwei Timings nicht eins parallel habe. Mit 'delete msg;' lösche ich beide, wenn ich mich nicht irre. 139 Fehlercode –
verursachen Zuerst ist das Löschen einer Nachricht innerhalb von handleMessage, ohne die Funktion selbst zu unterbrechen, gefährlich, da andere 'if (msg == ...)' Prüfungen fehlschlagen, da Sie die Nachricht gelöscht haben. Zweitens sind zwei Timings nur zwei Timer, Sie löschen einen Timer nicht, Sie löschen ihn nur, wenn sich der Zustand des Timers ändert, bevor er beendet ist (es hat keine Zeit mehr). Die Verwendung der gleichen Nachricht für zwei Timer könnte Sie mehr verwirren, als es hilft. Verwenden Sie für jeden Timer eine separate Timer-Nachricht, erstellen Sie sie bei Bedarf und brechen Sie sie bei Bedarf ab oder verschieben Sie sie neu. Löschen ist möglicherweise nur im Destruktor erforderlich. –