C++事件类回调示例

class AA{
public:
	void attach(const function<void(int)>& callback){
		m_callback = callback;
	}
	void detach(const function<void(int)>& callback){
		m_callback = function<void(int)>();
	}
	void processAsyn(){
		cout << "AA::processAsyn tid = " << this_thread::get_id() << endl;
		m_th = std::thread(&AA::threadFun, this);
		m_th.detach();
	}

private:
	void threadFun(){
		_sleep(300);
		cout << "AA::threadFun tid = " << this_thread::get_id() << endl;
		if (m_callback){
			m_callback(20);
		}
	}
	function<void(int)> m_callback;
	thread m_th;
};

class BB{
public:
	void exec(){
		cout << "BB::exec tid = " << this_thread::get_id() << endl;
		m_a = make_unique<AA>();
		m_a->attach(std::bind(&BB::onRes, this, std::placeholders::_1));
		m_a->processAsyn();
	}
	//m_b = std::make_unique<B>();
	//m_b->attachCallback(std::bind(&A::onProcessDone, this, std::placeholders::_1));
	//m_b->attachCallback([this](int res){ return onProcessDone(res); });
	//m_b->detachCallback(std::bind(&A::onProcessDone, this, std::placeholders::_1));
	//m_b->processAsyn();

private:
	void onRes(int val){
		cout << "BB::onRes tid = " << this_thread::get_id() << endl;
		cout << val << endl;
	}
	std::unique_ptr<AA> m_a{ nullptr };
};

//解耦 C++的事件驱动编程示例

#include <iostream>
#include <functional>
#include <vector>
#include <map>
#include <string>

//事件类型,functional可以涵盖仿函数、函数指针、lamda表达式
typedef std::function<void()> EventHandler;

//事件管理者类
class EventManeger{
public:
	void subscribe(const std::string& eventName, const EventHandler& handler){
		_subscribers[eventName].push_back(handler);
	}

	void publish(const std::string& eventName){
		auto it = _subscribers.find(eventName);
		if (it != _subscribers.end()){
			std::cout << "事件:" << eventName << " 发生了" << std::endl;
			for (auto& handler : it->second){
				handler();
			}
		}
		else{
			std::cout << "事件:" << eventName << " 未订阅" << std::endl;
		}
	}

private:
	std::map<std::string, std::vector<EventHandler>> _subscribers;	//订阅集合
};

//事件发生器类
class EventGenerator{
public:
	EventGenerator(EventManeger& manager) : _eventManager(manager){}
	//产生事件
	void generateEvent(const std::string& eventName){
		_eventManager.publish(eventName);
	}

private:
	EventManeger& _eventManager;
};


//订阅者类
class Subscriber{
public:
	Subscriber(const std::string& name) : _subscriberName(name){}

	void handleEvent(const std::string& eventName){
		std::cout << "订阅者:" << _subscriberName << "收到事件:" << eventName << " 且处理" << std::endl;
	}
private:
	std::string _subscriberName;
};

int main()
{
	//实例化对象
	EventManeger eventmanager;
	EventGenerator eventGenerator(eventmanager);
	Subscriber sub1("JJ");
	Subscriber sub2("KK");

	//订阅事件
	//产生照明事件,则触发sub1、sub2对应的事件处理
	eventmanager.subscribe("照明", [&](){ sub1.handleEvent("照明"); });
	eventmanager.subscribe("闪光", [&](){ sub2.handleEvent("闪光"); });
	eventmanager.subscribe("照明", [&](){ sub2.handleEvent("照明"); });

	eventGenerator.generateEvent("照明");
	eventGenerator.generateEvent("闪光");
	eventGenerator.generateEvent("hehe");

	return 0;
}

使用事件驱动编程来实现一个简单的GUI框架

#include <iostream>
#include <functional>
#include <vector>
#include <map>

// 定义事件类型
typedef std::function<void()> EventHandler;

// 事件管理器类
class EventManager {
public:
	void subscribe(const std::string& eventName, const EventHandler& handler) {
		subscribers[eventName].push_back(handler);
	}

	void publish(const std::string& eventName) {
		auto it = subscribers.find(eventName);
		if (it != subscribers.end()) {
			// 触发该事件的所有订阅者的处理函数
			for (auto& handler : it->second) {
				handler();
			}
		}
	}

private:
	std::map<std::string, std::vector<EventHandler>> subscribers;
};

// GUI组件基类
class GUIComponent {
public:
	GUIComponent(EventManager& manager) : eventManager(manager) {}

	virtual void onClick() = 0;
	virtual void onHover() = 0;
	virtual void onKeyDown() = 0;

protected:
	EventManager& eventManager;
};

// 按钮组件
class Button : public GUIComponent {
public:
	Button(EventManager& manager) : GUIComponent(manager) {}

	void onClick() override {
		std::cout << "按钮被点击了!" << std::endl;
		eventManager.publish("ButtonClickedEvent");
	}

	void onHover() override {
		std::cout << "鼠标悬停在按钮上!" << std::endl;
		eventManager.publish("ButtonHoveredEvent");
	}

	void onKeyDown() override {
		std::cout << "按钮获取键盘焦点!" << std::endl;
		eventManager.publish("ButtonKeyDownEvent");
	}
};

// 订阅者类
class Subscriber {
public:
	void handleButtonClick() {
		std::cout << "收到按钮点击事件并进行处理" << std::endl;
		// 具体的处理逻辑
	}

	void handleButtonHover() {
		std::cout << "收到按钮悬停事件并进行处理" << std::endl;
		// 具体的处理逻辑
	}

	void handleButtonKeyDown() {
		std::cout << "收到按钮键盘按下事件并进行处理" << std::endl;
		// 具体的处理逻辑
	}
};

int main() {
	EventManager eventManager;
	Button button(eventManager);
	Subscriber subscriber;

	// 订阅按钮事件
	eventManager.subscribe("ButtonClickedEvent", [&]() { subscriber.handleButtonClick(); });
	eventManager.subscribe("ButtonHoveredEvent", [&]() { subscriber.handleButtonHover(); });
	eventManager.subscribe("ButtonKeyDownEvent", [&]() { subscriber.handleButtonKeyDown(); });

	// 模拟用户与按钮交互
	button.onClick();
	button.onHover();
	button.onKeyDown();

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值