我目前正在研究Veins 4.7.1上的算法,其中许多车辆和RSU正在发送和接收消息。
我现在想让我的RSU执行定期计算,无论它是发送还是接收消息。问题是我不知道如何在RSU应用程序中以及在何处实现这些定期计算。
我的第一个尝试是使用BaseWaveApplLayer
提供的功能之一实现计算。我虽然打算通过计时器将它们添加到handlePositionUpdate(cObject* obj)
中,但是我显然不能在RSU应用程序中使用此功能。
任何帮助将非常感激。
最佳答案
使用自我消息是在模块中执行定期任务的典型方法。但是,如果您需要执行多个任务,则可能会出现问题。您需要首先创建所有消息,正确处理它们,并记住在析构函数中对它们进行cancelAndDelete
编码。
使用称为TimerManager
的Veins实用程序(在Veins 4.7中添加),可以用更少的代码来实现相同的结果。您需要在模块中具有TimerManager
的成员,并在initialize
中指定任务。这样做的好处是,如果您决定以后再添加新的定期任务,那么就像将它们添加到initialize
中一样简单,并且TimerManager
将处理其他所有事情。它可能看起来像这样:
class TraCIDemoRSU11p : public DemoBaseApplLayer {
public:
void initialize(int stage) override;
// ...
protected:
veins::TimerManager timerManager{this}; // define and instantiate the TimerManager
// ...
};
和
initialize
void TraCIDemoRSU11p::initialize(int stage) {
if (stage == 0) { // Members and pointers initialization
}
else if (stage == 1) { // Members that require initialized other modules
// encode the reaction to the timer firing with a lambda
auto recurringCallback = [this](){
//Perform Calculations
};
// specify when and how ofthen a timer shall fire
auto recurringTimerSpec = veins::TimerSpecification(recurringCallback).interval(1);
// register the timer with the TimerManager instance
timerManager.create(recurringTimerSpec, "recurring timer");
}
}
在Github手册中了解更多信息:TimerManager manual。带注释的代码是从那里获取的。