我们在.net里写代码,会经常通过事件来处理程序流程,比如IO操作完成、失败或遇到一个特殊的数据等等,触发一个事件,然后做相应处理。
那么我们在托管C++里如何实现触发事件呢?
其步骤和.net里写一个事件的步骤差不多是一样的,分以下几步(我拿公司SIP通话的部分代码来讲解):
一,定义一个委托
你可以自定义一个委托,也可以直接使用.net框架为你预定义的专用于事件的委托,我这里自定义了一个委托。
namespace AVWrapper
{
public enum class SipEventEnum
{
// 未注册
NotLogined,
// 已注册
Login,
// 对方正在处理
Processing,
// 对方正在响铃
Ringning,
// 对方已接听
Answered,
// 通讯关闭
Closed,
// 未知
Unknown
};
// SIP 通讯事件
public delegate void SipEventHandler(System::Object^ sender, SipEventEnum^ args);
}
二,定义事件
我删除了不重要的代码,大家重点看如何定义事件。在下述代码中,我定义了一个函数Fire,用于触发事件。
public ref class SipWrapper
{
public:
SipWrapper(void);
~SipWrapper(void);
!SipWrapper(void);
// 触发事件
void Fire(SipEventEnum args);
public:
// SIP 通讯状态
event SipEventHandler^ SipEvent;
};
三,触发事件
到这里,就简单了,根据程序运行情况,触发相应事件
void SipWrapper::Fire(SipEventEnum args)
{
SipEvent(this, args);
}
四,应用
经过前面3步,托管C++里的事件就定义好了,也能按你的程序逻辑触发,那么剩下的事,就是别人如何使用你的事件了,写过.net事件处理程序的,这就是小菜一碟了,我写个简单的例子吧
AVWrapper.SipWrapper sip = new AVWrapper.SipWrapper();
sip.SipEvent += new AVWrapper.SipEventHandler(OnSipEvent);
private void OnSipEvent(object sender, Enum args)
{
AVWrapper.SipEventEnum sipEvent = (AVWrapper.SipEventEnum)args;
// 处理你的程序逻辑
}