POCO C++库学习和分析 -- 通知和事件 ( 二 )
2. 通知和事件的总览
2.1 相关类信息
下面是Poco库和通知、事件相关的类1) 同步通知实现:类Notification和NotificationCenter
2) 异步通知实现:类Notification和NotificationQueue
3) 事件 Events
2.2 概述
Poco文档上对于通知和事件的区别做了如下描述:1) 通知和事件是Poco库中支持的两种消息通知机制,目的是为了在源对象(source)发生某事件(something)时能够及时通知目的对象(target)
2) 使用Poco中的通知,必须注意通知对象(target)也可称观察者(observer)将无法得知事件源的情况。Poco::NotificationCenter和Poco::NotificationQueue是消息传递的中间载体,用来对源(source)和目标(target)进行解耦。
3) 如果对象(target)或者说观察者(observer)期望知道事件源的情况,或者想只从某一个确切的源接收事件,可以使用Poco::Event。Poco中的Event同时支持异步和同步消息。
看了上面的文档,千万不要以为通知无法获取源对象的信息。事实上,通过对代码的改写,我们也可以使通知支持上述功能。只不过通知是基于消息源角度的设计,在设计时,就认为对于通知者,关注重点并不在消息源,而在消息类型。关于这一点,可以看前面一篇文章 POCO C++库学习和分析 -- 通知和事件(一)。
下图说明了同步消息时,消息发送的流程:
3. 同步通知
3.1 消息
所有的通知类都继承自Poco::Notification,其定义如下:class Notification: public RefCountedObject
{
public:
typedef AutoPtr<Notification> Ptr;
Notification();
virtual std::string name() const;
protected:
virtual ~Notification();
};
从定义看,我们可以发现其从RefCountedObject类继承,也就是说其是一个引用计数对象。作为从RefCountedObject中继承的引用计数对象,毫无疑问在其在Poco中使用是和AutoPtr类配合的,完成堆对象的自动回收。关于AutoPtr的介绍,可以看前面的文章 POCO