【问题标题】:how to cancel a timer when using timerManager in veins omnet在静脉 omnet 中使用 timerManager 时如何取消计时器
【发布时间】:2019-10-06 12:48:08
【问题描述】:

我正在使用静脉提供的 TimerManager 类来管理我的模拟中的计时器。 我创建了一个每 5 秒触发一次的循环计时器,我想在收到特定消息时取消它,但我不知道如何使用取消方法:

void cancel(TimerHandle handle)

我不明白 TimerHandle 是什么以及我应该将什么参数传递给该方法以取消计时器

PS:我想取消一个特定的计时器而不是 TimerManager 实例

【问题讨论】:

  • 能否分享您使用的软件版本(OMNeT++ 和 Veins)?

标签: omnet++ veins


【解决方案1】:

创建计时器时,TimerManager::create 返回一个TimerHandle。您可以通过将它传递给TimerManager::cancel 来使用它来取消计时器。

【讨论】:

  • 所以我必须声明一个 TimerHandle : TimerHandle=timerManager.create(TimerSpec, "timerName"); 然后通过这个 TimerHandel 取消但我不知道如何声明一个 TimerHandle 我错过了一些东西
  • 是的,这就是你必须做的。要将句柄存储在您的班级中,您可以使用data member
  • 我试过这个:在 file.h Veins::TimerManager timerManager{this}; Veins::TimerManager::TimerHandle handle; 在 file.c handle=timerManager.create(ttrTimerSpec, "recurring timer"); 并取消:timerManager.cancel(handle); 但我没有工作,计时器没有取消
  • 你描述你的方法的方式对我来说似乎是正确的。您可能在这里遇到了错误。您是否介意分享您的代码,或者更好的是,在 GitHub 上使用最小可行示例打开问题?
  • 有一个微妙的错误:initialize 被多次调用,因为该类继承了BaseModule,它定义了numInitStages 以返回2。通常的方法是使用if (stage == X) {...} 保护初始化中的逻辑,其中 X 定义您要使用的阶段,因为某些逻辑取决于早期阶段在基类中初始化的字段。在我们的例子中,使用阶段 0 应该没问题。
【解决方案2】:

@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(){}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    相关资源
    最近更新 更多