【Poco库源码解析】Poco库的事件

本文详细介绍了Poco库中事件处理的核心组件,包括Delegate类的设计、DefaultStrategy的委托管理以及BasicEvent和AbstractEvent模板类的实现。同时涵盖了同步和异步事件的示例,展示了如何通过Delegate传递事件并调用目标类的回调函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用示例

#include "Poco/BasicEvent.h"
#include "Poco/Delegate.h"
#include <iostream>
using Poco::BasicEvent;
using Poco::Delegate;
class Source
{
   
	public:
	BasicEvent<int> theEvent;
	void fireEvent(int n)
	{
   
	theEvent(this, n);
	// theEvent.notify(this, n); // alternative syntax
	}
};

class Target
{
   
public:
 void onEvent(const void* pSender, int& arg)
 {
   
 	std::cout << "onEvent: " << arg << std::endl;
 }
};

int main(int argc, char** argv)
{
   
	Source source;
	Target target;
	source.theEvent += Poco::delegate(&target, &Target::onEvent);
	source.fireEvent(42);
	source.theEvent -= Poco::delegate(&target, &Target::onEvent);
	return 0;
}

2.Event流动过程

在这里插入图片描述
从图上看实现事件的类被分成了几类:

  1. Delegate:
    AbstractDelegate,Delegate,Expire,FunctionDelegate,AbstractPriorityDelegate,PriorityDelegate,FunctionPriorityDelegate

  2. Strategy:
    NotificationStrategy,PriorityStrategy,DefaultStrategy,FIFOStrategy

  3. Event:
    AbstractEvent,PriorityEvent,FIFOEvent,BasicEvent

3.源码分析

Delegate 类:

template <class TObj, class TArgs, bool withSender = true> 
class Delegate: public AbstractDelegate<TArgs>
{
   
public:
	typedef void (TObj::*NotifyMethod)(const void*, TArgs&);

	Delegate(TObj* obj, NotifyMethod method):
		_receiverObject(obj), 
		_receiverMethod(method)
	{
   
	}

	Delegate(const Delegate& delegate):
		AbstractDelegate<TArgs>(delegate),
		_receiverObject(delegate._receiverObject),
		_receiverMethod(delegate._receiverMethod)
	{
   
	}

	~Delegate()
	{
   
	}
	
	Delegate& operator = (const Delegate& delegate)
	{
   
		if (&delegate != this)
		{
   
			this->_receiverObject = delegate._receiverObject;
			this->_receiverMethod = delegate._receiverMethod;
		}
		return *this;
	}

	bool notify(const void* sender, TArgs& arguments)
	{
   
		Mutex::ScopedLock lock(_mutex);
		if (_receiverObject)
		{
   
			(_receiverObject->*_receiverMethod)(sender, arguments);
			return true;
		}
		else return false;
	}

	bool equals(const AbstractDelegate<TArgs>& other) const
	{
   
		const Delegate* pOtherDelegate = reinterpret_cast<const Delegate*>(other.unwrap());
		return pOtherDelegate && _receiverObject ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值