/* created: 2010/12/04 created: 4:12:2010 20:39 filename: EventHandler.h author: dzwwgy@163.com purpose: */ #include <hash_map> #ifndef __IMsgHandler_h__ #define __IMsgHandler_h__ struct IEventHandler { virtual ~IEventHandler(void) {} virtual bool HandleEvent(void* pEvent) = 0; }; template<typename ThisType, typename EventData> class TMethod : public IEventHandler { public: typedef bool (ThisType::*TMemFun)(EventData* pEvent); TMethod(ThisType* pThis, TMemFun pFun) :m_pThis(pThis) ,m_pFun(pFun) { } virtual bool HandleEvent(void* pEvent) { return HandleEventMsg(static_cast<EventData*>(pEvent)); } virtual bool HandleEventMsg(EventData* pEvent) { return (m_pThis->*m_pFun)(pEvent); } private: ThisType* m_pThis; TMemFun m_pFun; }; template<typename ThisType, typename EventData> IEventHandler* NewEventHandler(ThisType* pThis, bool (ThisType::*pFun)(EventData*)) { return new TMethod<ThisType, EventData>(pThis, pFun); } //EventHandlerMgr struct IEventHandler; typedef IEventHandler* PEventHandler; typedef stdext::hash_multimap<unsigned int, IEventHandler*> EVENT_HANDLER_MAP; class TEventHandlerMgr { EVENT_HANDLER_MAP m_MsgHandlerMap; public: TEventHandlerMgr(void) {} ~TEventHandlerMgr(void) {} bool Listen(unsigned int nEvnetId, PEventHandler pMsgHandler) { m_MsgHandlerMap.insert(std::make_pair(nEvnetId, pMsgHandler)); return true; } PEventHandler FindEventHandler(unsigned int nEvnetId) { EVENT_HANDLER_MAP::iterator itr = m_MsgHandlerMap.find(nEvnetId); if (itr==m_MsgHandlerMap.end()) return NULL; return itr->second; } bool RemoveListen(unsigned int nMsgId) { return true; } }; #endif // __IMsgHandler_h__ /* created: 2010/12/04 created: 4:12:2010 20:55 filename: TWidget.h author: dzwwgy@163.com purpose: Used for test IEventHandler */ #include "EventHandler.h" #ifndef __TWidget_h__ #define __TWidget_h__ #define EVTID_MOUSE_CLICK 1 struct MouseClickInfo { unsigned int nX; unsigned int nY; }; class TWidget { protected: TEventHandlerMgr m_evtHandlerMgr; public: TWidget(void) {} ~TWidget(void) {} bool Listen(unsigned int nEvnetId, PEventHandler pMsgHandler) { return m_evtHandlerMgr.Listen(nEvnetId, pMsgHandler); } bool RemoveListen(unsigned int nEvnetId) { return m_evtHandlerMgr.RemoveListen(nEvnetId); } void MouseClick() { PEventHandler pEvtHand = m_evtHandlerMgr.FindEventHandler(EVTID_MOUSE_CLICK); if (pEvtHand == NULL) return ; MouseClickInfo aMouseClickInfo; aMouseClickInfo.nX = 50; aMouseClickInfo.nY = 50; pEvtHand->HandleEvent(&aMouseClickInfo); } }; class TDialog : TWidget { TWidget m_btnOk; TWidget m_btnCancel; TWidget m_btnClose; public: TDialog() { m_btnOk.Listen(EVTID_MOUSE_CLICK, NewEventHandler(this, &TDialog::OnButtonOkClick)); m_btnCancel.Listen(EVTID_MOUSE_CLICK,NewEventHandler(this, &TDialog::OnButtonCancelClick)); m_btnClose.Listen(EVTID_MOUSE_CLICK, NewEventHandler(this, &TDialog::OnButtonCancelClick)); } void SimulateClick() { m_btnOk.MouseClick(); } private: bool OnButtonOkClick(MouseClickInfo* pEvent) { pEvent->nX; pEvent->nY; return true; } bool OnButtonCancelClick(MouseClickInfo* pEvent) { pEvent->nX; return true; } }; #endif // __TWidget_h__ int _tmain(int argc, _TCHAR* argv[]) { TDialog dlgMain; dlgMain.SimulateClick(); }
docker網絡規劃 docker network create kafka-net --subnet 172.20.0.0/16 docker network ls zookeeper1(172.20.0.11 2184:2181
「Pygors系列」一句話導讀: MinGW-w64只有編譯器,MSYS2帶着更新環境,WSL2實用性比較高 歷史與淵源 Windows平臺 Linux平臺 二進制兼容 WSL2:運行Linux程序 Wine:運行Wi
「Pygors系列」一句話導讀: Python、Go、Rust、C程序跨平臺GUI框架研究。 一、問題 Pygors是什麼? Pygors是我自己創造的一個詞,就是Python、Go、Rust、C四種語言的合體。目的是爲了跨平臺GUI應
lsof: list open files 作用1:可查端口號被哪個進程佔用 比如我們跑自動化,經常會遇到端口號被佔用,無法啓動driver lsof -i :8081 lsof 輸出的結果含義: fd:文件描述符的數字,通常是一個
1. 添加用戶 在macOS中,可以通過命令行使用dscl(Directory Service command line utility)工具來添加用戶。以下是使用dscl添加用戶的步驟: 打開終端:可以通過在Spotlight搜索中輸
Flink的代碼編寫流程爲env->source->transform->sink,基本所有的代碼都是大致按照圖1的流程進行代碼編寫,當然中間也會有一些封裝之類的。 Flink代碼寫好後,它的任務調度執行圖按照生成順序分爲:邏輯流圖(
前言 前不久Redis宣佈從 Redis 7.4 開始,將原先比較寬鬆的 BSD 源碼使用協議修改爲 RSALv2 和 SSPLv1 協議,該協議變化意味着Redis不再開源。今天給大家分享一款完全開源(MIT協議)、免費的Redis替代性
接口 一、簡介 1.1 接口是什麼 接口是 前後端通信的橋樑 簡單理解:一個接口就是 服務中的一個路由規則 ,根據請求響應結果 接口的英文單詞是 API (Application Program Interface),所以有時也稱之爲 AP
記賬本
Java Solon 是什麼框架? Java “新的”應用開發框架。開放原子開源基金會,孵化項目。從零開始構建(非 java-ee 架構),有靈活的接口規範與開放生態。 追求: 更快、更小、更簡單 提倡: 剋制、簡潔、高效、開放、生態
什麼是Puppeteer Puppeteer 是一個由 Google 開發的 Node.js 庫,它提供了一組用於控制 Headless Chrome 的 API。 Headless Chrome 是 Chrome 瀏覽器的無界面版本,可以
neutron port-list |grep ipneutron port-update a7fbxxf6cc2 --allowed_address_pairs type=dict list=true ip_address=vipne
參考:https://apisix.apache.org/docs/apisix/plugins/authz-keycloak/ kc插件源碼梳理及原理說明 如果只是進行keycloak頒發的token進行校驗(簽名校驗和有效期校驗),
1、添加請求對應的數據源標籤 DynamicDataSourceContextHolder.push(ds); 2、添加數據源 3、動態添加數據源 private DynamicRoutingDataSource dataSo
至於任務調度這個基礎功能,重要性不言而喻,大多數業務系統都會用到,世面上有很多成熟的三方庫比如Quartz,Hangfire,Coravel 這裏我們不討論三方的庫如何使用 而是從0開始自己製作一個簡易的任務調度,如果只是到分鐘級別的粒度基