如何在js中 .publishh中发表子函数

在ROS中,想在回调函数中发布消息,有两个思路:
(1)把函数写成类的形式,把需要的一些变量在类中声明为全局变量。
(2)在函数中,把回调函数需要调用的变量声明为全局变量。也可以解决这个问题。
[FATAL] [.]: ASSERTION FAILED
file = /opt/ros/indigo/include/ros/publisher.h
line = 102
cond = false
[FATAL] [.]: Call to publish() on an invalid Publisher
[FATAL] [.]:
参考网址:
http://answers.ros.org/question/214386/how-to-publish-a-message-in-a-callback-function/
/Hacks4ROS/h4r_joysound/blob/develop/src/joysound_node.cpp
http://answers.ros.org/question/232068/call-to-publish-on-an-invalid-publisher/
以后记得,有事多Google,网上很多答案。一定要耐心查看。
本文已收录于以下专栏:
相关文章推荐
回调函数call back最通俗易懂的解释,初学者很快就能理解
1、P2P模型
在P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到...
1、P2P模型
在P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到...
1、P2P模型
在P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到...
1:安装和基本概念过程布标
把ADS的文件放到RVDS2.2的工程里,make时出现invalid call from '~PRES8' function to 'REQ8'...
google加ARM网站,找到一段解释:
用过C++进行过面向对象程序设计的用户都知道,程序中的对象很少单独存在。不考虑对象间的相互作用几乎是不可能的。所以,标识对象间的关系或建立对象间的消息连接是面向对象程序设计的一项重要任务。本文着重从C...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)描述性分类
Discuz! X1.5后台
X-Space系列
来自站长百科
通过更改文章状态来发表文章。
&?php wp_publish_post( $post_id ) ?&
(整数)(必需)文章编号
默认值:None
用法:$wpdb
用法:通过调用$post_id和$post(文章资料)上以下函数:
自2.1.0版本后
wp_publish_post()位于wp-includes/post.php中。博客访问: 223214
博文数量: 54
博客积分: 0
博客等级: 民兵
技术积分: 575
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C#/.net
订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相应对象间的一致性,这样会给维护、扩展和重用都带来不便。当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,就可以使用订阅发布模式了。
一个抽象模型有两个方面,其中一方面依赖于另一方面,这时订阅发布模式可以将这两者封装在独立的对象中,使它们各自独立地改变和复用。订阅发布模式所做的
工作其实就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
在我们日常写程序时,经常遇到下面这种情况:
public void 有告警信息产生()
刷新界面();
更新数据库();
给管理员发Mail();
………………………………
当有告警信息产生时,依次要去执行:刷新界面()、更新数据库()、给管理员发Mail()等操作。表面上看代码写得很工整,其实这里面问题多多:
首先,这完全是面向过程开发,根本不适合大型项目。
第二,代码维护量太大。设想一下,如果产生告警后要执行10多个操作,那这将是个多么大,多少复杂的类呀,时间一长,可能连开发者自己都不知道如何去维护了。
第三,扩展性差。如果产生告警后,要增加一个声音提示()功能,怎么办呢?没错,只能加在有告警信息产生()这个函数中,这样一来,就违反了“开
放-关闭原则”。而且修改了原有的函数,那么在测试时,除了要测新增功能外,还要做原功能的回归测试;在一个大型项目中,做一次回归测试可能要花费大约两
周左右的时间,而且前提是新增功能没有影响原来功能及产生新的bug。
那么如何把有告警信息产生()函数同其他函数进行解耦合呢?别着急,下面就介绍今天的主角----订阅发布模式。见下图:
上面的流程就是对有告警信息产生()这个函数的描述。我们要做的,就是把产生告警和它需要通知的事件进行解耦,让它们之间没有相互依赖的关系,解耦合图如下:
事件触发者被抽象出来,称为消息发布者,即图中的P。事件接受都被抽象出来,称为消息订阅者,即图中的S。P与S之间通过S.P(即订阅器)连接。
这样就实现了P与S的解耦。首先,P就把消息发送到指定的订阅器上,从始至终,它并不知道也不关心要把消息发向哪个S。S如果想接收消息,就要向订阅器进
行订阅,订阅成功后,S就可以接收来自S.P的消息了,从始至终,S并不知道也不关心消息来源于哪个具体的P。同理,S还可以向S.P进行退订操作,成功
退订后,S就无法接收到来自指定S.P的消息了。这样就完美的解决了P与S之间的解耦。
等等,好像还有一个问题。从图上看,虽然P与S之间完成了解耦,但是P与S.P,S与S.P之间不就又耦合上了吗?其实这个问题好解决,想想我们上篇的是怎么解耦的?对,就接口。这里我们同样使用接口来解决P与S.P和S与S.P之间的解耦,同时,使用delegate来解决多订阅多发布的机制。
下面给出实现代码。由于订阅发布模式涉及P, S.P和S三部份内容,所以代码比较多,也比较长。请大家耐心阅读。
首先,为了实现P与S.P, S与S.P之间的解耦,我们需要定义两个接口文件
ISubscribe.cs
namespace TJVictor.DesignPattern.SubscribePublish
//定义订阅事件
public delegate void SubscribeHandle(string str);
//定义订阅接口
public interface ISubscribe
event SubscribeHandle SubscribeE
namespace TJVictor.DesignPattern.SubscribePublish
//定义发布事件
public delegate void PublishHandle(string str);
//定义发布接口
public interface IPublish
event PublishHandle PublishE
void Notify(string str);
然后我们来设计订阅器。显然订阅器要实现双向解耦,就一定要继承上面两个接口,这也是我为什么用接口不用抽象类的原因(类是单继承)。
namespace TJVictor.DesignPattern.SubscribePublish
public class SubPubComponet : ISubscribe, IPublish
private string _subN
public SubPubComponet(string subName)
this._subName = subN
PublishEvent += new PublishHandle(Notify);
#region ISubscribe Members
event SubscribeHandle subscribeE
event SubscribeHandle ISubscribe.SubscribeEvent
add { subscribeEvent += }
remove { subscribeEvent -= }
#endregion
#region IPublish Members
public PublishHandle PublishE
event PublishHandle IPublish.PublishEvent
add { PublishEvent += }
remove { PublishEvent -= }
#endregion
public void Notify(string str)
if (subscribeEvent != null)
subscribeEvent.Invoke(string.Format("消息来源{0}:消息内容:{1}", _subName, str));
接下来是设计订阅者S。S类中使用了ISubscribe来与S.P进行解耦。代码如下:
namespace TJVictor.DesignPattern.SubscribePublish
public class Subscriber
private string _subscriberN
public Subscriber(string subscriberName)
this._subscriberName = subscriberN
public ISubscribe AddSubscribe { set { value.SubscribeEvent += S } }
public ISubscribe RemoveSubscribe { set { value.SubscribeEvent -= S } }
private void Show(string str)
Console.WriteLine(string.Format("我是{0},我收到订阅的消息是:{1}", _subscriberName, str));
最后是发布者P,继承IPublish来对S.P发布消息通知。
namespace TJVictor.DesignPattern.SubscribePublish
public class Publisher:IPublish
private string _publisherN
public Publisher(string publisherName)
this._publisherName = publisherN
private event PublishHandle PublishE
event PublishHandle IPublish.PublishEvent
add { PublishEvent += }
remove { PublishEvent -= }
public void Notify(string str)
if (PublishEvent != null)
PublishEvent.Invoke(string.Format("我是{0},我发布{1}消息", _publisherName, str));
至此,一个简单的订阅发布模式已经完成了。下面是调用代码及运行结果。调用代码模拟了图2中的订阅发布关系,大家可以从代码,运行结果和示例图三方面对照着看。
#region TJVictor.DesignPattern.SubscribePublish
//新建两个订阅器
SubPubComponet subPubComponet1 = new SubPubComponet("订阅器1");
SubPubComponet subPubComponet2 = new SubPubComponet("订阅器2");
//新建两个发布者
IPublish publisher1 = new Publisher("TJVictor1");
IPublish publisher2 = new Publisher("TJVictor2");
//与订阅器关联
publisher1.PublishEvent += subPubComponet1.PublishE
publisher1.PublishEvent += subPubComponet2.PublishE
publisher2.PublishEvent += subPubComponet2.PublishE
//新建两个订阅者
Subscriber s1 = new Subscriber("订阅人1");
Subscriber s2 = new Subscriber("订阅人2");
//进行订阅
s1.AddSubscribe = subPubComponet1;
s1.AddSubscribe = subPubComponet2;
s2.AddSubscribe = subPubComponet2;
//发布者发布消息
publisher1.Notify("博客1");
publisher2.Notify("博客2");
//发送结束符号
Console.WriteLine("".PadRight(50,'-'));
//s1取消对订阅器2的订阅
s1.RemoveSubscribe = subPubComponet2;
//发布者发布消息
publisher1.Notify("博客1");
publisher2.Notify("博客2");
//发送结束符号
Console.WriteLine("".PadRight(50, '-'));
#endregion
#region Console.ReadLine();
Console.ReadLine();
#endregion
运行结果图:
如需转载,请注明本文原创自CSDN TJVictor专栏:
阅读(2712) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。查看: 6237|回复: 3|关注: 0
matlab中脚本文件中如内嵌函数
<h1 style="color:# 麦片财富积分
新手, 积分 10, 距离下一级还需 40 积分
关注者: 1
我想写个脚本文件,里面想要内嵌好几个函数以备调用(我不想把函数写成独立的函数文件,多了我自己都高不清,想把所有的程序放在一起,以免混乱);请问怎么搞啊,
例如怎么处理下面这个简单的例子:
a=3;b=5;&&%%赋值
h=& &&&;&&%%%%%调用函数
function y=mean2(a,b)
不知道我讲清楚了没。拜谢给位大虾了。
<h1 style="color:# 麦片财富积分
script里面不能有subfunction
只有在function里面才能有。
<h1 style="color:#0 麦片财富积分
关注者: 52
脚本不行,你可以把脚本写成函数形式,其他的函数就跟在后面,成为子函数,这样是可以的。
1 提问请直接在论坛中发帖,不要发站内消息给我。
2 不要在QQ中问我提问,这样很浪费时间
<h1 style="color:# 麦片财富积分
edifiers2008 发表于
脚本不行,你可以把脚本写成函数形式,其他的函数就跟在后面,成为子函数,这样是可以的。 ...
能不能把子函数放在主函数的前面呢?我想用publish功能生成报告,让子函数显示在前面可以增强报告的可读性,但我试了很久都不行
站长推荐 /2
机器视觉和人工智能在医疗设备中的应用及实现
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区网站已改版,请使用新地址访问:
CVI2009_Publish_Method CVI一般发布程序步骤,这个是试验了很多次得 笔记,都是在 现场项目开发中验 SCM 单片机
259万源代码下载-
&文件名称: CVI2009_Publish_Method& & [
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 79 KB
&&上传时间:
&&下载次数: 5
&&提 供 者:
&详细说明:CVI一般发布程序步骤,这个是试验了很多次得到的笔记,都是在CVI2009现场项目开发中验证记录下来的方法,CVI发布有问题的话可以看看。-CVI general release program step, this is the experiment many times to get the notes recorded methods are validated in CVI2009 site project development, CVI release in question, then you can look at.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&CVI2009的发布步骤.docx
&[]:和说明完全不符
&近期下载过的用户:
&输入关键字,在本站259万海量源码库中尽情搜索:}

我要回帖

更多关于 eclipse中publish 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信