как отменить таймер при использовании timerManager в венах omnet - PullRequest
3 голосов
/ 06 октября 2019

Я использую класс TimerManager, предоставленный в венах, для управления таймерами в моей симуляции. Я создал повторяющийся таймер, который срабатывает каждые 5 секунд, и я хочу отменить его при получении определенного сообщения, но я не знаю, как использовать метод отмены:

void cancel(TimerHandle handle)

Я не понимаю, что такое TimerHandle и какой параметр я должен передать методу для отмены таймера

PS: я хочу отменить определенный таймер, а не экземпляр TimerManager

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

При создании таймера, TimerManager::create возвращает TimerHandle. Вы можете использовать это для отмены таймера, передав его TimerManager::cancel.

0 голосов
/ 10 октября 2019

@ Horstinator это мой код: заявка RSU

    #ifndef RSUAPP_H_
    #define RSUAPP_H_
    #include <omnetpp.h>
    #include "veins/modules/application/ieee80211p/BaseWaveApplLayer.h"
    #include "ttr_m.h"
    #include "veins/modules/utility/TimerManager.h"

    using namespace omnetpp;
    using Veins::TimerManager;

    class rsuApp : public BaseWaveApplLayer {
    public:
    rsuApp();
    ~rsuApp();
    virtual void initialize(int stage);
    virtual void finish();
    protected:
    virtual void onBSM(BasicSafetyMessage* bsm);
    virtual void onWSM(WaveShortMessage* wsm);
    virtual void onWSA(WaveServiceAdvertisment* wsa);
    virtual void handleSelfMsg(cMessage* msg);
    virtual void handlePositionUpdate(cObject* obj);
//declaration of the TimerManager instance and the handle
    TimerManager timerManager{this};
    TimerManager::TimerHandle handle;
    };
   #endif

.

   #include "rsuApp.h"
   #include "ttr_m.h"
   #include "veins/modules/utility/TimerManager.h"
   #include <map>

   Define_Module(rsuApp);

   rsuApp::rsuApp(){}
   void rsuApp::initialize(int stage) {
   BaseWaveApplLayer::initialize(stage);
     auto ttrTimer = [this](){
                Ttr* ttr = new Ttr();
                populateWSM(ttr);
                sendDown(ttr);
          };
       auto ttrTimerSpec = Veins::TimerSpecification(ttrTimer).interval(1);
       handle=timerManager.create(ttrTimerSpec, "recurring timer");
   }

   void rsuApp::finish() {
     BaseWaveApplLayer::finish();
   }

   void rsuApp::onWSM(WaveShortMessage* wsm) {
     if(strcmp(wsm->getName(),"tip")==0){
       findHost()->getDisplayString().updateWith("r=60,red");
   //canceling the timer when a wsm message  is received 
       timerManager.cancel(handle);
     }
   }

   void rsuApp::handleSelfMsg(cMessage* msg) {
    BaseWaveApplLayer::handleSelfMsg(msg);
     timerManager.handleMessage(msg);  
   }

  void rsuApp::onBSM(BasicSafetyMessage* bsm) {}
  void rsuApp::onWSA(WaveServiceAdvertisment* wsa) {}
  void rsuApp::handlePositionUpdate(cObject* obj) {
   BaseWaveApplLayer::handlePositionUpdate(obj);
  }
  rsuApp::~rsuApp(){}
...