使用“事件”机制来检测程序的运行状态
最近写的几个AO程序,都涉及到对上千上万条记录进行空间运算,结果一旦运行起来,CPU很快上升到100%,整个程序基本处于不可动的状态。因此,对空间运算,如裁减或座标转换的过程进行检测就是一件非常重要的事情。
比如一个类方法中有一个循环,我需要对这个循环用进度条进行检测,但如果将进度条对象直接写入类中,就大大地降低了类的耦合度和独立性,将来别人使用我编写的类的时候,就会在这个地方遇到大问题,因为没有人能够保证别人也是用进度条来进行监测,并且进度条对象的名字和类型都是一摸一样。
为了解决这个问题,使得类更加健壮,我上网查看了一些资料,采用事件与委托机制完成了这个检测。我要解决的问题如下:对一个要素类的要素进行处理,这个要素类拥有上万条记录,我需要知道目前的处理到了何种程度,进度如何?对要素类中要素的处理是使用循环语句来进行的,因此解决方法就是,当某个要素处理完毕,就向外发送一条消息,由消息获得者来控制进度条的行为和状态,这样一来,我的类就不必与具体的进度条对象参合。
首先是在类A中声明一个事件,这个事件将在要素处理完后被触发向外通知(类A是要素处理类):
public event FeatOperFinished()
然后在处理代码中使用这个事件,如:
do while not pFeat is nothing
...处理要素
RaiseEvent FeatOperFinished()
pFeat=pFeatCursor.Next
Loop
这样,每当一个要素处理完毕后,都会触发一次该事件。
下面该处理监听此事件的对象了,一般而言,它都是直接用来管理进度条的类,比如一个有进度条的窗体等,在该窗体中声明类A,但使用的方法不再是Dim,而是Dim WithEvents pA as ClassA,它意味着我们可以使用ClassA中的事件,其实我们去看看在窗体上的那些控件的声明,都是用了WithEvents关键字的。
实现该事件,一般的写法类似如下:
Private Sub pA_FeatOperFinished() Handles pA.FeatOperFinished
if progressbar.value<progressbar.max then
progressbar.value=progressbar.value+1
end if
End Sub
方法简单,干净利落。
Related Items
Comments
Leave a comment
Or, take a look at Archives and Categories