C++实操 - Event概念介绍和定义一个Event类

关于事件

事件驱动系统通常用于有一些需要由程序处理的异步外部活动;例如,用户按下鼠标上的一个按钮。一个事件驱动的系统通常运行一个事件循环,持续等待此类活动,例如来自设备的输入或内部警报。当这些活动之一发生时,它收集关于该事件的数据,并将该事件分配给处理该事件的程序。

一个程序可以选择忽略事件,而且可能有一些库将一个事件分配给多个处理程序,这些处理程序可能被编程为监听一个特定的事件。与事件相关的数据至少要指定它是什么类型的事件,但也可能包括其他信息,如它发生的时间、谁或什么导致了它的发生,以及由事件源提供给处理程序的关于如何处理该事件的额外数据。

事件通常用于用户界面,外部世界的动作(鼠标点击、窗口大小调整、键盘按压、来自其他程序的信息等)被程序作为一系列事件来处理。为许多窗口环境编写的程序主要是由事件处理程序组成的。

事件也可以在指令集级别使用,它们是对中断的补充。与中断相比,事件通常是同步处理的:程序明确地等待事件的服务(通常是通过调用指令来分配下一个事件),而中断可以在任何时候要求服务。 

事件处理 Event handler

在计算机编程中,事件处理程序是一个回调子程序,处理程序中收到的输入(在Java和JavaScript中称为监听器)。每个事件都是来自底层框架的一段应用级信息,通常是GUI工具包。GUI事件包括按键、鼠标移动、选择动作和定时器。在一个较低的层次上,事件可以代表读取文件或网络流的新数据的可用性。事件处理程序是事件驱动编程的一个核心概念。

事件是由框架在解释低级别的输入的基础上创建的,这些输入可能是低级别的事件本身。例如,鼠标移动和点击被解释为菜单选择。事件最初起源于操作系统层面的行动,如硬件设备产生的中断、软件中断指令或轮询的状态变化。在这个层面上,中断处理程序和信号处理程序相当于事件处理程序。

创建的事件首先由框架内的事件调度器处理。它通常管理事件和事件处理程序之间的关联,并可能把事件或事件处理程序进行排队,等待后续处理。事件调度器可以直接调用事件处理程序,也可以等待事件被取消。

事件通知 Event notification

事件通知是一个与通信软件结合使用的术语,用于将产生小消息("事件")的应用程序与监测相关条件并可能采取由事件引发的行动的应用程序联系起来。

事件通知是现代数据库系统(用于通知应用程序他们所关注的条件已经发生)、现代操作系统(用于通知应用程序他们应该采取某些行动,如刷新窗口)和现代分布式系统的一个重要特征,在这些系统中,事件的生产者可能在与消费者不同的机器上。事件通知平台通常是这样设计的:产生事件的应用程序不需要知道哪些应用程序将消费它们,甚至不需要知道有多少应用程序将监视事件流。

它有时被用作发布-订阅的同义词,这个术语与支持网络设置中的事件通知的一类产品有关。虚拟同步模型有时被用来赋予事件通知系统和发布-订阅系统以更强的容错性和一致性保证。

用户产生的事件 User-generated events

有大量的情况或事件是程序或系统可能产生或回应的。一些常见的用户生成的事件包括:

鼠标事件

一个指向性设备可以产生一些软件可识别的指向性设备的手势。鼠标可以产生一些鼠标事件,如鼠标移动(包括移动方向和距离)、鼠标左/右键按下和释放、鼠标滚轮运动,或这些手势的组合。

键盘事件

在键盘上按下一个键或组合键会产生一个键盘事件,使当前运行的程序对引入的数据做出反应,如用户按了哪个键。

操纵杆事件

移动操纵杆会产生一个X-Y模拟信号。它们通常有多个按钮来触发事件。一些流行游戏盒的游戏手柄使用操纵杆。

触摸屏事件

使用触摸屏产生的事件通常被称为触摸事件或手势。

设备事件

设备事件包括由设备产生或对设备的动作,如摇晃、倾斜、旋转、移动等。

总结

事件可以用在程序中,用于不同组件间的通信,进行异步处理。

这种处理比直接调用API的方式更加灵活,分隔了调用方和被调用方,

------------------------------------ 

关于定义一个Event类

Event中的主要数据,应该就是一个event id,用整数表示即可。

同时为了方便跟踪调试,增加了类的静态变量,来统计Event的产生和消费的情况。

使用整数作为成员变量,当这个类析构时,不需要特殊的析构函数处理,因为没有包含指针型的成员变量。

这个类可以被继承,以便来包含更丰富的内容。

另外一个特别的地方,是对这个Event,需要判断两个event是否相等的情况,虽然是两个不同的event对象,但如果其内容是一样的,表示是两个相同的event。

代码如下:

这里是用typeid函数来判断两个Event对象是否是同一类型,父类和子类对象是不同的。

event.h

#include <cstdint>

#include <typeinfo>



class Event

{

public:

    Event(uint32_t _id);

    virtual ~Event(void);





    virtual bool operator==(const Event & ev) const

    {

        if(typeid(*this) != typeid(ev))

             return false;



        return (id == ev.id);

    }



    virtual bool operator!=(const Event & ev) const

    {

        return !(*this==ev);

    }



    uint32_t GetId(void){return id;}

protected:

    uint32_t id;

private:

    static int32_t nInstance;

    static int32_t nMaxInstance;

public:

    static int32_t GetInstance(void){return nInstance;}

    static int32_t GetMaxInstance(void){return nMaxInstance;}

};

event.cpp

#include <cstdio> /* For unit-test*/

#include "event.h"



int Event::nInstance = 0;

int Event::nMaxInstance = 0;





Event::Event(uint32_t _id): id(_id)

{

    nInstance++;

    if(nInstance > nMaxInstance)

    {

        nMaxInstance = nInstance;

    }

}



Event::~Event(void)

{

    nInstance--;

}



int main()

{

  Event e1(1);

  Event e2(1);



  if(e1==e2)

  {

    printf("Equal.\n");

  }

  else

  {

    printf("Not equal.\n");

  }



  printf("Event id: %d %d\n", e1.GetId(), e2.GetId());



  printf("Instance is %d, MaxInstance is %d.\n", Event::GetInstance(), Event::GetMaxInstance());



  return 0;

}

              

参考:

https://en.wikipedia.org/wiki/Event_(computing)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值