事件编程(一)
2007-03-15 21:53:34 来源:WEB开发网public __delegate void EventHandler(
Object* sender,
EventArgs* e
);
为了接收事件,你必须用正确的签名实现处理器成员函数并创建一个委托来包装该函数,然后调用事件的 += 操作符注册你的处理器/委托。对于上面的 Click 事件,代码应该像这样:
// event handler
void CMyForm::OnAbort(Object* sender, EventArgs *e)
{
...
}
// register my handler
m_abortButton->Click += new EventHandler(this, OnAbort);
注意该处理器函数必须具备由委托定义的签名。这是托管扩展的基本原则。但是你的问题涉及的不是托管事件,你问的是本机事件——如何实现本机 C++ 事件?C++ 本身没有内建的事件机制,那么该怎么实现呢?你可以用 typedef 来定义一个回调并让客户机来提供这个回调,这种做法有些类似 qsort——但那样太老土了。更不用说处理多个事件时的繁琐。相对于静态外部函数来说,用成员函数作为事件处理器是最丑陋的做法。
一种比较好的方法是创建一个定义事件的接口。那是 COM 的做法。但你不需要用 C++ 编写沉重的 COM 代码;你可以用一个简单的类。我写了一个类来做示范:CPrimeCalculator;这个类的功能是查找素数。代码如 Figure 3 所示。CPrimeCalculator::FindPrimes(n) 查找开始的 n 个素数。其工作原理是这样的,CPrimeCalculator 触发两种事件:Progress 事件和 Done 事件。这些事件都定义在 IPrimeEvents 接口中。IPrimeEvents 接口不是 .NET 和 COM 意义上的接口;它是一个纯粹的 C++ 抽象基类,它为每个事件处理器定义
签名(参数和返回类型)。处理 CPrimeCalculator 的客户机必须实现 IPrimeEvents,然后调用 CPrimeCalculator::Register 来注册它们的恶接口。CPrimeCalculator 将对象/接口添加到其内部列表(list)中。由于它会对每个整数进行素数检查,CPrimeCalculator 则周期性地报告到目前为止找到了多少个素数:
更多精彩
赞助商链接