3.5.1 事件管理器


        在CIM对象的宿主系统——基于Microstation的系统中,每时每刻都发生着各种各样的事件。如果我们能准确的知道许多特定事件的发生时机或者在特定事件发生时我们能得到通知,那么我们就有机会充分利用这些事件以设计一些能与系统紧密结合并协调运行的逻辑单元,从而实现以宿主系统为事件源的事件驱动型产品。比如,我们设计的某些逻辑可能需要在系统当前事务结束后且在图形系统开始全面刷新前被执行,我们需要能准确把握当前激活Model切换前后的时机,我们需要知道何时有Element添加到Model中了,等等。在以上这些场景下,我们就可以使用CIM系统提供的事件管理器CimEventManager来监听并响应系统级别的事件了。

       CimEventManager是个全局单例类,它会在CIM内核启动时自动并将自己设置为一个系统范围内的事件源。任何需要监听特定事件的构造,只需从CimEventManager监听即可。在实际使用时,由于CIM同时支持C++和C#两种接口方式,而这两种方式的使用不尽相同,具体如下:

       CimEventManager::Get().DropListener(pMyListener);

       delete pMyListener;

       pMyListener = nullptr;

                      1. 在期望能监听事件的类中,实现一个具备如下原型的方法:

                       public void OnEventCallback (object sender, CimEventManager.OnElementPropertyArgs); 

                     2. 在使用监听器之前,将其挂接到事件源上,例如:

                       CimEventManager.OnElementPropertyChanged += new EventHandler<CimEventManager.OnElementPropertyArgs>(OnEventCallback);

                    3. 不再需要监听器时,将其从事件源上断开,例如:

                      CimEventManager.OnElementPropertyChanged -= new EventHandler<CimEventManager.OnElementPropertyArgs>(OnEventCallback);

               目前,CimEventManager支持如下类型的事件:

       由于事件监听器的运行,是通过监听事件管理器中的事件来驱动的。所以,在设计事件监听器时应遵循以下原则进行: