c++ - 在 OMNET++ 中,如果它们都位于 WSN 中的不同 StandardHost 模块中,如何在运行时将控制值从一个应用程序发送到另一个应用程序?
问题描述
我正在开发一个基于 INET 4 框架的 OMNET++ 项目。我的网络由一个主节点和可变数量的从节点(默认为 65)组成,它们以星形配置连接。UdpBasicBurst
我有两个从班级扩展的应用程序(主和从) 。我想定期将控制信号从主应用程序(在主节点中)传输到从属应用程序(在从节点中)。由于我不知道或不了解如何使用信号侦听器来执行上述操作,因此我尝试直接从主应用程序访问从属应用程序中的方法:
在MasterApp::initialize()
:
for (int i=0;i<numHosts;i++){
char buf[30];
sprintf(buf,"slave[%d]",i);
cModule *mod = getParentModule();
cModule *moremod = mod->getParentModule();
cModule *downmod = moremod->getSubmodule(buf);
cModule *pmod = downmod->getSubmodule("app",0);
listener[i] = check_and_cast<SlaveApp*>(pmod);
}
在MasterApp::controlSP
(控制计算发生的地方;该函数的调度与 sendMessage() 或 generateBurst() 大致相同,后续调用之间的时间间隔为 1 秒):
for (i=0;i<numHosts;i++){
listener[i]->transferSP(SendProb);
}
在MasterApp.h
:
//Forward declaration
class SlaveApp;
class MasterApp: public UdpBasicBurst
也在里面MasterApp.h
:
SlaveApp *listener[65];
在SlaveApp.h
:
public:
double SPval;
void transferSP(double SendProb);
最后在SlaveApp.cc
:
void SlaveApp::transferSP(double SendProb){
Enter_Method_Silent();
SPval = SendProb;
}
通过上述操作,编译器没有抱怨,但模拟器崩溃了。调试工具显示崩溃是由以下原因触发的:
void cOwnedObject::setDefaultOwner(cDefaultList *list)
{
ASSERT(list != nullptr);
defaultOwner = list;
}
随后是上下文切换操作Enter_Method_Silent()
。
我没有好主意来实现这个功能。如果有人能够修复我上面提到的特定错误,或者有任何其他方法可以让 MasterApp 生成的控制值(双精度值)可以被 SlaveApp 读取,那就太好了。
解决方案
推荐阅读
- javascript - 如何从 Promise、reduce、format 内部返回数据?
- sql - 为什么 SQL 中存在“WHERE”?因为“HAVING”可以完成它的任务,而且还不止这些
- mongodb - .find() 填充查询 MongoDB (mongoose)
- sql-server - 创建表空间:CREATE、DROP 或 ALTER 语句中使用的未知对象类型“TABLESPACE”
- javascript - Chrome 网上应用店付款弃用 - 如何迁移
- amazon-web-services - CloudFormation 堆栈中的错误:策略中的语法错误。(服务:AmazonIdentityManagement;状态代码:400;
- amqp - Azure 服务总线 javax.jms.IllegalStateException:由于不可恢复的错误,MessageProducer 已关闭
- java - 用一个节点打印链表类失败
- python - 如何加速组合算法?
- python - Python TypeError:“NoneType”类型的对象没有 len()