VC++.NET中事件编程剖析之什么是事件
2007-04-09 21:34:16 来源:WEB开发网核心提示: 一种比较好的方法是创建一个定义事件的接口,那是 COM 的做法,VC++.NET中事件编程剖析之什么是事件(5),但你不需要用 C++ 编写沉重的 COM 代码;你可以用一个简单的类,我写了一个类来做示范:CPrimeCalculator;这个类的功能是查找素数,去看看有关迭代器反引用操作
一种比较好的方法是创建一个定义事件的接口。那是 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 则周期性地报告到目前为止找到了多少个素数:
// in CPrimeCalculator::FindPrimes
for (UINT p=2; p<max; p++) {
// figure out if p is prime
if (/* every now and then */)
NotifyProgress(GetNumberOfPrimes());
...
}
NotifyDone();
CPrimeCalculator 调用内部辅助函数 NotifyProgress 和 NotifyDone 来触发事件。这些函数遍历客户机对象列表,为每个客户机调用相应的事件处理器。代码如下:
void CPrimeCalculator::NotifyProgress(UINT nFound)
{
list<IPrimeEvents*>::iterator it;
for (it=m_clients.begin(); it!=m_clients.end(); it++) {
(*it)->OnProgress(nFound);
}
}
如果你对 STL 不熟悉,去看看有关迭代器反引用操作符的内容,它返回当前指向的对象,上面代码段中,for 循环里的代码等同于:
更多精彩
赞助商链接