事件编程(一)

航空母舰645

航空母舰645

2016-01-29 12:27

事件编程(一),事件编程(一)

C++ At Work 专栏...
事件编程(一)

原著:Paul DiLascia
翻译:NorthTibet

下载源代码:CAtWork00602.exe (175KB)
原文出处:Event Programming


在微软 .NET 框架中可以定义托管类事件并用委托和 += 操作符处理这些事件。这种机制似乎很有用,那么在本机 C++ 中有没有办法做同样的事情?Several Readers 确实如此!Visual C++ .NET 具备所谓统一事件模型(Unified Event Model),它可以像托管类一样实现本机事件(用 __event 关键字),但是由于本机事件存在一些不明显的技术问题,而微软的老大不打算解决这些问题,所以他们要我正式奉劝你不要使用它们。那么这是不是就是说 C++ 程序员与事件无缘了呢?当然不是!可以通过别的方法实现。本文我将向你展示如何轻松实现自己漂亮的事件系统。
  但是在动手之前,让我先大体上介绍一下事件和事件编程。它是个重要的主题,当今对事件没有坚实的理解,你是无法编写程序的——什么是事件以及什么时候使用事件。
  成功的编程完全在于对复杂性的掌控。很久以前,函数被称为“子程序”(我知道,我这样说证明我已经老了!)管理复杂性的主要方式之一是自顶向下的编程模式。高层实现类似“宇宙模型”,然后将它划分为更小的任务如:“银河系模型”以及“太阳系模型”等等,直到任务被划分为可以用单个函数实现为止。目前自顶向下的编程模型仍被用于过程化的任务实现当中,但它不适用于发生顺序不确定的实时事件响应系统。经典的例子便是 GUI,程序必须响应用户的某些行为,比如按键或是鼠标移动。实际上,事件编程很到程度上源于图形用户界面的出现。
  在自顶向下的模型中,在顶部的高级部分对低级的实现各种不同任务的函数——如 DoThis,DoThat 进行食物链式的调用。但不久以后,低层部分需要回调(talk back),在 Windows 中,可以调用 Rectangle 或 Ellipse 绘制一个矩形或椭圆,但最终 Windows 需要调用你的应用程序来画窗口。但应用程序都还不存在,它仍然处于被调用度状态!那么 Windows 如何知道要调用哪个函数呢?这就是事件用处之所在。


Figure 1 自顶向下和自底向上

  在每个 Windows 程序的核心——不论是直接用 C 语言编写的还是使用 MFC 或 .NET 框架类编写——都是一个处理消息的窗口过程,这些消息如:WM_PAINT, WM_SETFOCUS 和 WM_ACTIVATE。你(MFC 或 .NET)实现窗口过程并将它传递给 Windows。到了该画窗口,改变输入焦点以及激活窗口的时候,Windows 用相应的消息代码调用你的过程。这个消息就是事件。窗口过程就是事件处理器。
  如果过程化编程是自顶向下的,事件编程是自底向上。在典型的软件系统中,函数的调用流是从较高级部分到低级部分进行的;而事件是以相反的方向过滤的,如 Figure 1 所示。当然,在现实的开发中层次关系并不总是这么清晰。许多软件系统看起来更像 Figure 2 所示的情况:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)


Figure 2 混合模型

  那么到底什么叫事件?其实,事件就是回调。而不是在编译时就已知名字的函数调用,组件调用在运行时调用你提供的函数。在 Windows 中,它是一个窗口过程。在 .NET 框架中,它叫做委托。不管术语怎么叫,事件提供了一种软件组件调用函数的方式,这种调用方式直到运行时才知道要调用什么函数。回调被称为事件处理器。发生或触发一个事件意味调用这个事件处理器。为此,事件接收部分首先得给事件源提供一个事件处理器的指针,这个过程叫注册。
  通常在以下几种场合下我们要使用事件:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)通知客户机实际的事件:用户按下某个按键;午夜时钟敲响;风扇停止工作造成 CPU 烧毁;当拷贝文件或搜索巨型数据库时,报告耗时操作的过程,组件可以周期性地触发某个事件以报告已拷贝了多少文件或已搜索了多少记录;如果你使用 IWebBrowser2 在自己的应用程序中宿主 IE,报告所发生的重要的或引起注意的事件,浏览器会在导航到某个新页面之前或之后通知你,或者在创建一个新窗口时通知你。调用应用程序提供的算法:C 运行时库函数 qsort 排序对象数组,但你必须提供比较函数。借助许多 STL 容器也能实现同样的诀窍.大多数程序员不会调用 qsort 回调某个事件,但你没有理由不考虑那种方式。它
展开更多 50%)
分享

猜你喜欢

事件编程(一)

C语言教程 C语言函数
事件编程(一)

事件编程(二)

C语言教程 C语言函数
事件编程(二)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

自己编程模拟 MouseEnter,MouseExit 事件

编程语言 网络编程
自己编程模拟 MouseEnter,MouseExit 事件

JScript面向事件驱动的编程

Web开发
JScript面向事件驱动的编程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Visual C#事件与接口编程实例

编程语言 网络编程
Visual C#事件与接口编程实例

SQL编程(一)

Delphi
SQL编程(一)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Flash新手入门教程:AS2代码制作鼠标跟随龙舟效果

Flash新手入门教程:AS2代码制作鼠标跟随龙舟效果

《海岛奇兵》快速获取宝石攻略

《海岛奇兵》快速获取宝石攻略
下拉加载更多内容 ↓