WEB开发网
开发学院软件开发VC 事件编程(一) 阅读

事件编程(一)

 2007-03-15 21:53:34 来源:WEB开发网   
核心提示: Figure 1 自顶向下和自底向上 在每个 Windows 程序的核心——不论是直接用 C 语言编写的还是使用 MFC 或 .NET 框架类编写——都是一个处理消息的窗口过程,这些消息如:WM_PAINT, WM_SETFOCUS 和 WM


Figure 1 自顶向下和自底向上

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


Figure 2 混合模型

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

  • 通知客户机实际的事件:用户按下某个按键;午夜时钟敲响;风扇停止工作造成 CPU 烧毁;
  • 当拷贝文件或搜索巨型数据库时,报告耗时操作的过程,组件可以周期性地触发某个事件以报告已拷贝了多少文件或已搜索了多少记录;
  • 如果你使用 IWebBrowser2 在自己的应用程序中宿主 IE,报告所发生的重要的或引起注意的事件,浏览器会在导航到某个新页面之前或之后通知你,或者在创建一个新窗口时通知你。
  • 调用应用程序提供的算法:C 运行时库函数 qsort 排序对象数组,但你必须提供比较函数。借助许多 STL 容器也能实现同样的诀窍.大多数程序员不会调用 qsort 回调某个事件,但你没有理由不考虑那种方式。它是“时间比较”事件。
  • 一些读者问:异常和事件之间有什么差别?主要差别是:异常表示不应该发生的意外情况。例如,你的程序运行耗尽内存,或者遇到被零除。这些都是你并不希望发生的异常情况,并且一旦出现这些情况,你的程序必须要做出相应的处理。另一方面,事件则是每天常规操作的部分并且完全是预期的。用户移动鼠标或按下某个键。浏览器导航到一个新页面。从控制流的角度看,事件是一次函数调用,而异常则是堆栈的突然跳跃,用展开的语义销毁丢失的对象。
      有关事件常见的概念误解是认为它们是异步的。虽然事件常常被用于处理用户输入和其它异步发生的行为 ,但事件本身是以同步方式发生的。触发一个事件与调用该事件处理器是同一件事情。用伪码表示就像如下的代码段:

    上一页  1 2 3 4 5  下一页

    Tags:事件 编程

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接