POCOC库学习和分析--通知和事件

上传人:平*** 文档编号:15579911 上传时间:2017-11-05 格式:DOCX 页数:12 大小:128.71KB
返回 下载 相关 举报
POCOC库学习和分析--通知和事件_第1页
第1页 / 共12页
POCOC库学习和分析--通知和事件_第2页
第2页 / 共12页
POCOC库学习和分析--通知和事件_第3页
第3页 / 共12页
POCOC库学习和分析--通知和事件_第4页
第4页 / 共12页
POCOC库学习和分析--通知和事件_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《POCOC库学习和分析--通知和事件》由会员分享,可在线阅读,更多相关《POCOC库学习和分析--通知和事件(12页珍藏版)》请在金锄头文库上搜索。

1、POCO C+库学习和分析 - 通知和事件 (四)5. 事件Poco 中的事件和代理概念来自于 C#。对于事件的使用者,也就是调用方来说,用法非常的简单。5.1 从例子说起首先让我们来看一个同步事件例子,然后再继续我们的讨论:cpp view plaincopy1. #include Poco/BasicEvent.h 2. #include Poco/Delegate.h 3. #include 4. 5. using Poco:BasicEvent; 6. using Poco:Delegate; 7. 8. class Source 9. 10. public: 11. BasicEve

2、nt theEvent; 12. void fireEvent(int n) 13. 14. theEvent(this, n); 15. / theEvent.notify(this, n); / alternative syntax 16. 17. ; 18. 19. class Target 20. 21. public: 22. void onEvent(const void* pSender, int& arg) 23. 24. std:cout ,目标对象Target。其中 source.theEvent += Poco:delegate(&target, &Target:onEv

3、ent)完成了,目标向数据源事件注册的过程。大家都知道在 C+中,程序运行是落实到类的实例的,看一下消息传递的过程,Poco 是如何解决这个问题。target 是目标对象实例, Target:onEvent 目标对象处理事件的函数入口地址。source.fireEvent(42)触发事件运行,其定义为:cpp view plaincopy1. void fireEvent(int n) 2. 3. theEvent(this, n); 4. / theEvent.notify(this, n); / alternative syntax 5. theEvent(this, n)中存在两个参数,

4、其中 n 为 Target:onEvent(const void* pSender, int& arg)处理函数的参数,可理解为消息或者事件内容;this 给出了触发源实例的信息。ok。这样消息的传递流程出来了。消息源实例的地址,消息内容,目标实例地址,目标实例类的处理函数入口地址。使用者填入上述信息就可以传递消息了。相当简单。而对于事件的开发者,如何实现上述功能。这是另外一码事,用 C+实现这么一个功能还是挺复杂的一件事。看一下使用语言的方式,想一下用到的 C+技术:1. +=/-= 重载cpp view plaincopy1. source.theEvent += Poco:delegat

5、e(&target, &Target:onEvent); 2. 仿函式cpp view plaincopy1. theEvent(this, n); 3. 模板开发者是不应该限定使用者发送消息的类以及接受消息类的类型的,因此 C+中能够完成此功能的技术只有模板了。关于模板编程还想聊上几句。STL 的特点在于算法和数据结构的分离,这个其实也是泛型编程的特点。如果把使用者对于类的应用过程看做算法过程的话,就可以对这个过程进行泛型编程。同时应该注意的是,算法和数据结构是存在关联的,这是隐含在泛型编程中的,能够使用某种算法的数据结构一定是符合该种算法要求的。就拿 Poco 中事件的委托 Delegat

6、e 来说,目标对象处理事件的函数入口是存在某种假设的。Poco 中假设入口函数必须是如下形式之一:cpp view plaincopy1. void (TObj:*NotifyMethod)(const void*, TArgs&); 2. void (TObj:*NotifyMethod)(TArgs&); 3. void (*NotifyMethod)(const void*, TArgs&); 4. void (*NotifyMethod)(void*, TArgs&); 5.2 事件的实现下面一张图是 Poco 中 Event 的类图:下面另一张图是 Poco 中 Event 流动的过

7、程: 从图上看实现事件的类被分成了几类:1) Delegate: AbstractDelegate,Delegate,Expire,FunctionDelegate,AbstractPriorityDelegate,PriorityDelegate,FunctionPriorityDelegate:2) Strategy:NotificationStrategy,PriorityStrategy,DefaultStrategy,FIFOStrategy3) Event:AbstractEvent,PriorityEvent,FIFOEvent ,BasicEvent我们取 Delegate,D

8、efaultStrategy,BasicEvent 来分析,其他的只是在它们的基础上加了一些修饰,流程类似。Delegate 类定义如下:cpp view plaincopy1. template 2. class Delegate: public AbstractDelegate 3. 4. public: 5. typedef void (TObj:*NotifyMethod)(const void*, TArgs&); 6. 7. Delegate(TObj* obj, NotifyMethod method): 8. _receiverObject(obj), 9. _receiver

9、Method(method) 10. 11. 12. 13. Delegate(const Delegate& delegate): 14. AbstractDelegate(delegate), 15. _receiverObject(delegate._receiverObject), 16. _receiverMethod(delegate._receiverMethod) 17. 18. 19. 20. Delegate() 21. 22. 23. 24. Delegate& operator = (const Delegate& delegate) 25. 26. if (&dele

10、gate != this) 27. 28. this-_receiverObject = delegate._receiverObject; 29. this-_receiverMethod = delegate._receiverMethod; 30. 31. return *this; 32. 33. 34. bool notify(const void* sender, TArgs& arguments) 35. 36. Mutex:ScopedLock lock(_mutex); 37. if (_receiverObject) 38. 39. (_receiverObject-*_r

11、eceiverMethod)(sender, arguments); 40. return true; 41. 42. else return false; 43. 44. 45. bool equals(const AbstractDelegate& other) const 46. 47. const Delegate* pOtherDelegate = reinterpret_cast(other.unwrap(); 48. return pOtherDelegate & _receiverObject = pOtherDelegate-_receiverObject & _receiv

12、erMethod = pOtherDelegate-_receiverMethod; 49. 50. 51. AbstractDelegate* clone() const 52. 53. return new Delegate(*this); 54. 55. 56. void disable() 57. 58. Mutex:ScopedLock lock(_mutex); 59. _receiverObject = 0; 60. 61. 62. protected: 63. TObj* _receiverObject; 64. NotifyMethod _receiverMethod; 65

13、. Mutex _mutex; 66. 67. 68. private: 69. Delegate(); 70. ; 我们可以看到 Delegate 类中存储了目标类实例的指针 _receiverObject,同时存储了目标类处理函数的入口地址_receiverMethod,当初始化 Delegate 实例时,参数被带进。Delegate 类中处理事件的函数为 bool notify(const void* sender, TArgs& arguments),这是一个虚函数. 如果去看它的实现的话,它最终调用了目标类处理函数(_receiverObject-*_receiverMethod)(

14、sender, arguments)。如果用简单的话来描述 Delegate 的作用,那就是目标类的代理。在 Poco 中对于 Delegate 提供了模板函数 delegate,来隐藏 Delegate 对象的创建,其定义如下:cpp view plaincopy1. template 2. static Delegate delegate(TObj* pObj, void (TObj:*NotifyMethod)(const void*, TArgs&) 3. 4. return Delegate(pObj, NotifyMethod); 5. 在来看 DefaultStrategy 类,其定义如下:cpp view plaincopy1. template 2. class DefaultStrategy: public NotificationStrategy 3. / Default notification

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号