关于消息抽象的想法

  为了屏蔽消息接收处理对象的细节,或者说,为了统一消息传递机制,使得消息通知回调机制与接收者的依赖性最小,需要定义一种方式,用于消息派发时统一识别消息接收者。

  比如:我们采用 SendMessage(handle, msg, wparam, lparam); 或者PostMessage来发送消息,handle应该是外部注入的一个对本身事件感兴趣的对象,由于在业务流程中,这个对象可能是窗口,也可能是通道/或通讯协议实例/或流程对象,而不同的对象接收消息的队列是不一样的,因此我们必须提供一种机制,用于在SendMessage(PostMessage)中识别接收者并把消息放入不同的消息队列,以便处理,或者调用对应的XXSendMessage来转发消息。这样,就把前端的接口统一了,包括SendMessage(PostMessage)和 handle.

  这里我的解决办法是,handle不仅包括对象指针,比如窗口指针,同时包括对象类型。两者结合的方法,就是用一定的高位来表示类型,经过掩模计算的低位为指针,对象指针转为handle,通过一个Ptr2Handle(Ptr, ObjType)来实现。函数内部通过一个全局数据ObjTypeShiftBits(移位位数)来进行移位,ObjTypeShiftBits此变量可以在部署时调整,以便适应实际系统,缺省可以为4位,支持16个类型。(我想起来,早期windows中采用的是低4位保留对象类型信息的方法)。SendMessage在转发消息时需要把handle转为指针了,Handle2Ptr(handle),内部利用ObjTypeShiftBits进行相应处理。

  另外,我们统一定义对象类型:比如01为窗口,02为通道,03为协议实例,04为流程实例,05为主保护,06为后备保护,等等。此处凡是能够列为类型的,必须内部标准化接口,并且提供接收消息队列的实现,并动态注册到消息分发体系中,这样才可能统一处理,所以,没有规范接口的需要统一规范,这都是我们今年需要做的事情。

  我想,这个思想的核心是对象的全局唯一识别机制,就是一个handle,同时提供对象类型和对象指针,这个思想在数据库设计中,就是每个数据ID既包括数据类型(因为不同数据放于不同表中,所以此类型也可以认为是表序号),也包括本身在表中的唯一下标。这样,任何数据ID都可以找到了。先得到表,再在表中查找id,当然如果找不到,就是该数据不存在了。

  当然指针和id还是两回事,所以我们无法判断指针是否有效,除非我们把对象指针放在一个指针/id结构的数组里,并把id作为指针传到外部,id自动递增,这样,我们也可以实现识别对象id是否生命期有效了。从这里我们可以看到,随着设计思想的发展,handle本身和指针之间越来越远 。这也是我们在windows中看到的事情。

  另外再说说interface的用途,interface是一种统一的访问方式(基于IUnKnown),但是只用于同步调用,不能用于异步调用。并且在实现扩展性上不如消息机制灵活,因为每次增加一个接口函数,需要定义一个新的GUID,然后继承,然后实现。而消息机制,只需要增加一个switch的case而已,可以灵活配置。当然interface在解决对象生命期方面,以及对象释放时内存跨模块释放方面是最好的解决方案。可以说,interface是一种开发期的方案,并且用于底层功能实现,而消息机制因为可以实现配置,所以是一种集成方案,用于高层组态。在解决不同的问题时需要采取不同的方案,这也是对设计师的基本要求。

  通过消息机制,我们实现了一种访问任何对象的线程安全的方法, 这也部分实现了全局统一模型的目标.后续会详细设计消息体系.包括SendMessage和PostMessage的实现, 消息队列的申请和注册,消息分发实现机制等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值