1. 程式人生 > >C++ 事件機制實現

C++ 事件機制實現

#ifndef IEVENT_H
#define IEVENT_H/*
 以下各基礎設施是在C++中事件機制的完整實現,事件是面向元件開發的必要特性之一。
  
 創 作 者:sky
 時    間:2005.06.22 
 修訂時間:2005.06.22
*/

#include 
"../Collection/SafeArrayList.h"
template
<class SenderType ,class ParaType>class EventPublisher ;

class NullType
{
};

// IEventHandler  是事件處理控制代碼,預定事件的類從此介面繼承以實現事件處理函式template<
class SenderType ,class ParaType>interface IEventHandler
{

public:
 
virtual~IEventHandler(){}
private:
 
virtualvoid HandleEvent(SenderType sender ,ParaType para)  =0 ;
 friend 
class EventPublisher<SenderType ,ParaType> ;
};

// IEvent 事件預定方通過此介面預定事件template<class SenderType ,class ParaType>interface
 IEvent
{
public:

 
virtual~IEvent(){}
 
virtualvoid Register  (IEventHandler<SenderType ,ParaType>* handler) =0 ;  
 
virtualvoid UnRegister(IEventHandler<SenderType ,ParaType>* handler) =0 ;
};

// IEventActivator 事件釋出方通過此介面觸發事件template<class SenderType ,class ParaType>interface IEventActivator
{
public:

 
virtual~IEventActivator(){}
 
virtualvoid Invoke(SenderType sender ,ParaType para) =0;
 
virtualint  HandlerCount() =0;
 
virtual IEventHandler<SenderType ,ParaType>* GetHandler(int index) =0;
};

// IEventPublisher 事件釋出方釋出事件相當於就是釋出一個IEventPublisher派生類的物件
// 不過僅僅將該物件的IEvent介面釋出即可。template<class SenderType ,class ParaType>interface IEventPublisher : public IEvent<SenderType ,ParaType> ,public IEventActivator<SenderType ,ParaType> 
{
};

// EventPublisher是IEventPublisher的預設實現template<class SenderType ,class ParaType>class EventPublisher :public IEventPublisher<SenderType ,ParaType>
{
private:
 SafeArrayList
< IEventHandler<SenderType ,ParaType>> handerList ;
 IEventHandler
<SenderType ,ParaType>* innerHandler ;

public:
 
void Register(IEventHandler<SenderType ,ParaType>* handler) 
 {
  
this->handerList.Add(handler) ;
 }

 
void UnRegister(IEventHandler<SenderType ,ParaType>* handler)
 {
  
this->handerList.Remove(handler) ;
 }

 
void Invoke(SenderType sender ,ParaType para)
 {
  
int count =this->handerList.Count() ;
  
for(int i=0 ;i<count ;i++)
  {
   IEventHandler
<SenderType ,ParaType>* handler =this->handerList.GetElement(i) ;
   handler
->HandleEvent(sender ,para) ;
  }
 } 

 
int  HandlerCount()
 {
  
returnthis->handerList.Count() ;
 }

 IEventHandler
<SenderType ,ParaType>* GetHandler(int index)
 {
  
returnthis->handerList.GetElement(index) ;
 }
};

#endif

相關推薦

C++ 事件機制實現

#ifndef IEVENT_H#define IEVENT_H/* 以下各基礎設施是在C++中事件機制的完整實現,事件是面向元件開發的必要特性之一。   創 作 者:sky 時    間:2005.06.22  修訂時間:2005.06.22*/#include "../Collection/SafeArr

C#中使用事件機制實現執行緒間的通訊

在圖形介面中的運用程式中,通常是主執行緒負責UI人機互動,而將需要迴圈執行和耗資源的邏輯程式碼和複雜的業務實現以及資料互動放到單獨一個執行緒裡執行。這樣可以保證主執行緒UI可以正常進行人機互動。 而執行緒之間的資料互動,就涉及了執行緒通訊。這裡將通過一個給MCU升級韌體程式的IAP(在應用

C++異常機制實現機制

++ 檢查 剛才 next exc 基類 判斷 需要 了解 1、C函數的調用和返回   要理解C++異常機制實現之前,首先要了解一個函數的調用和返回機制,這裏面就要涉及到ESP和EBP寄存器。我們先看一下函數調用和返回的流程。 下面是按調用約定__stdcall 調用函數

c#事件機制

c#有一個很重要的高階語言特性,叫做事件,有很多人說事件就是委託,其實不然,事件包含委託,但絕對不是委託,因為事件只能在類中宣告,而委託可以在函式也就是方法中宣告,另外,事件的方法也少於委託,那麼什麼是事件呢,使用事件,需要在類中宣告,並且事件始終是共有方法,而且使用事件需要

【Unity遊戲開發】用C#和Lua實現Unity中的事件分發機制EventDispatcher

一、簡介   最近馬三換了一家大公司工作,公司制度規範了一些,因此平時的業餘時間多了不少。但是人卻懶了下來,最近這一個月都沒怎麼研究新技術,部落格寫得也是拖拖拉拉,週六周天就躺屍在家看帖子、看小說,要麼就是吃雞,唉!真是罪過罪過。希望能從這篇部落格開始有些改善吧,儘量少玩耍

架構模式--C++類模板實現事件觸發機制

//帶一個引數的事件觸發器 template<class PTR> class CEvent { private: typedef void (*Handle)(PTR);

C++事件(Event)機制實現一例(轉載)

C++事件(Event)機制的實現一例[原始碼下載連結已修復] 作者:袁曉輝([email protected]) 宣告: 1、 本文為作者原創,如需轉載請保持本文的完整性並註明出自 www.farproc.c

C++事件(Event)機制實現

用C++實現事件機制我以前寫過一個小例子,但不是很完善,比如Event只能接受全域性函式作為handler,類成員方法不可以,還有一個Event只能新增一個handler等……最近我的一個程式剛好要用到Event機制,所以我就抽了些時間,重新實現了一下。這個版本應該說是比較完

C#內置的事件機制和Unity3D姻緣

mono 需要 listen 存在 logs sharp strong 關聯 有一種 最近因為項目,也因為一些其他事情而導致學習的停止,抽個空來記錄下C#內置的事件在Unity3D中的使用。 我需要讓一個物體對鼠標懸停做出事件的響應的情況下,我們通常會創建一個繼承Mon

PHP實現事件機制實例分析

word-wrap [0 popu except switch targe att otto 對象 PHP實現事件機制實例分析 內置了事件機制的語言不多,php也沒有提供這種功能。事件(Event)說簡單了就是一個Observer模式。實現起來非常ea

C++異常機制實現方式和開銷分析 (大圖,編譯器會為每個函數增加EHDL結構,組成一個單向鏈表,非常著名的“內存訪問違例”出錯對話框就是該機制的一種體現)

執行 對話框 這也 很多 包括 一個棧 簡單 tid 一點 白楊 http://baiy.cn   在我幾年前開始寫《C++編碼規範與指導》一文時,就已經規劃著要加入這樣一篇討論 C++ 異常機制的文章了。沒想到時隔幾年以後才有機會把這個尾巴補完 :-)。 還

(轉)Linux下通過rsync與inotify(異步文件系統事件監控機制)實現文件實時同步

-a 推送 root started init.d log tool mysql同步 .tar.gz Linux下通過rsync與inotify(異步文件系統事件監控機制)實現文件實時同步原文:http://www.summerspacestation.com/linux%

C++反射機制:可變參數模板實現C++反射

https dcm ESS 容易出錯 指定 ring 人員 時間處理 emp 1. 概要   本文描述一個通過C++可變參數模板實現C++反射機制的方法。該方法非常實用,在Nebula高性能網絡框架中大量應用,實現了非常強大的動態加載動態創建功能。Neb

C++反射機制:可變參數OA信用盤平臺搭建模板實現C++反射

github () 簡單的 同學 多重繼承 是什麽 定義 通用 插件 概要OA信用盤平臺搭建Q1446595067 ??本文描述一個通過C++可變參數模板實現C++反射機制的方法。該方法非常實用,在Nebula高性能網絡框架中大量應用,實現了非常強大的動態加載動態創建功能。

心跳機制tcp keepalive的討論、應用及“斷網”、"斷電"檢測的C代碼實現(Windows環境下)

astar har 心跳 存在 假設 clu ali clean struct 版權聲明:本文為博主原創文章,轉載時請務必註明本文地址, 禁止用於任何商業用途, 否則會用法律維權。 https://blog.csdn.net/stpeace/article/details/

C# 事件訂閱、退訂簡單實現原理

這裡以汽車經銷商、顧客為例說明(當顧客訂閱了汽車資訊後,就能夠接受汽車經銷商傳送的訊息) 1、新建一個事件監聽類,如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Tex

Objective-C runtime機制(6)——weak引用的底層實現原理

前言 提起弱引用,大家都知道它的作用: (1)不會新增引用計數 (2)當所引用的物件釋放後,引用者的指標自動置為nil 那麼,圍繞它背後的實現,是怎麼樣的呢?在許多公司面試時,都會問到這個問題。那麼,今天就帶大家一起分析一下weak引用是怎麼實現的,希望能夠搞清楚每一個細節。 S

Google開源C++單元測試框架Google Test系列(gtest)之- 事件機制

gtest提供了多種事件機制,非常方便我們在案例之前或之後做一些操作。總結一下gtest的事件一共有3種: 全域性的,所有案例執行前後。 TestSuite級別的,在某一批案例中第一個案例前,最後一個案例執行後  TestCase級別的,每個TestCase前後。 全域

Unity實現自己的事件機制(簡單實現

事件機制廣泛應用於mvc模式中,靈活的事件機制能夠彌補Unity中的一些缺陷,比如協程的執行。因為協程不能返回值,也不能通過out或者ref傳遞。通過事件機制,可以知道協程執行進度並且返回執行結果。當然,這只是個舉例,也只是我習慣用的一種方式。如果有更好的實現方式,希望不吝

react合成事件實現機制

在 React 底層,主要對合成事件做了兩件事:事件委派和自動繫結。 1. 事件委派 在使用 React 事件前,一定要熟悉它的事件代理機制。它並不會把事件處理函式直接繫結到 真實的節點上,而是把所有事件繫結到結構的最外層,使用一個統一的事件監聽器,這個事件監 聽器上維持了一個對映