`

对AEECallback结构体及其基础函数的分析

    博客分类:
  • C++
阅读更多
typedef struct _AEECallback AEECallback;
struct _AEECallback
{
AEECallback *pNext;  //保留,并且调用程序不得修改此成员
void        *pmc;  //保留,并且调用程序不得修改此成员
PFNCBCANCEL  pfnCancel;  //回调被取消时,指向回调处理程序所调用函数的指针。调用程序必须将此指针设置为 NULL。
void        *pCancelData; //传递给 pfnCancel 的数据。 调用程序不得修改此成员。
PFNNOTIFY    pfnNotify;  //AEE 调用的回调函数。调用程序必须将此指针设为指向 AEE 回调处理程序所调用的函数。
void        *pNotifyData; //传递给 pfnNotify 的数据,调用程序必须将此指针设为指向须传递给 pfnNotify函数的数据。
void        *pReserved;  //保留,并由回调处理程序使用此成员
};
该结构体,前两个参数pNext和pmc都是不可修改的,是系统维护其值;pfnCancel和pCancelData是在取消回调时使用的;pfnNotify和pNotifyData是在回调时使用的;最后一个pReserved是保留参数,可以存储任何数据。

AEECallback_Setup函数:
1、通过CALLBACK_Cancel宏调用了pcb中的pfnCancel函数。
2、给pfnCancel赋值,给pCancelData赋值
3、给pReserved赋值,其值是pfnCancelNotify
备注:猜想该函数的功能就是为pcb结构体赋值,按次序分别是pfnCancel、pCancelData、pReserved

static void AEECallback_Setup(AEECallback *pcb, PFNCBCANCEL pfnCancel,
                              void *pvCancel, PFNSCHEDNOTIFY pfnCancelNotify)
{
   CALLBACK_Cancel(pcb);
   pcb->pfnCancel   = pfnCancel;
   pcb->pCancelData = pvCancel;
   pcb->pReserved   = (void *)pfnCancelNotify;
}

AEECallback_Fire函数:
1、把参数强制类型转换为AEECallback类型
2、把pfnCancel赋值为0
3、调用pfnNotify函数
备注:猜想该函数的功能就是调用notify函数

static void AEECallback_Fire(void *pvCxt)
{
   AEECallback *pcb = (AEECallback *)pvCxt;

   pcb->pfnCancel = 0;
   pcb->pfnNotify(pcb->pNotifyData);
}

AEECallback_CancelNotify函数:
1、从pReserved指针中取出保存的pfnCancelNofity,并且强制类型转换,猜想该成员的职责就是保存一些需要保存的指针
2、把pfnCancel置为0
3、调用pfnCancelNotify函数
备注:该函数其实就是要调用其中的CancelNotify函数,只是该函数指针保存在了void类型的pReserved成员里头,需要进行强制类型转换,注意的一点是在调用notify类函数的时候都把pfcCancel置为了0,不知道是何用意

static void AEECallback_CancelNotify(AEECallback *pcb)
{
   PFNSCHEDNOTIFY pfnCancelNotify = (PFNSCHEDNOTIFY)pcb->pReserved;

   pcb->pfnCancel = 0;
   pfnCancelNotify(pcb->pCancelData, AEECallback_Fire, pcb);
}

AEECallback_SchedNotifyWait函数:
1、先通过AEECallback_Setup函数来填充pcb结构体
2、再调用pfnSched函数
备注:不明白这个函数什么意思

void AEECallback_SchedNotifyWait(AEECallback *pcb, void *pSchedNotifyObj,
                                 PFNSCHEDNOTIFY pfnSched,
                                 PFNSCHEDNOTIFY pfnCancel)
{
   AEECallback_Setup(pcb, AEECallback_CancelNotify, pSchedNotifyObj, pfnCancel);
   pfnSched(pSchedNotifyObj, AEECallback_Fire, pcb);
}




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiyucn/archive/2006/01/22/586349.aspx
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics