快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

C++中建立对象间消息连接的系统方法(2)


   for(int start=0;start<lastpos;start++)
    if(callBackList[start].IsEmpty()){
     callBackList[start] = EventRecord(event,pCBSF);
     break;
    }
   if(start < lastpos) return; file://a hole is found
   if(lastpos == size) file://event list is insufficient
   {
    EventRecord *tempList = callBackList;
    callBackList = new EventRecord[size + CALLBACKLIST_INCREMENT];

    if(!callBackList){
     cerr<<"CallBack: memory allocation error."<<endl;
     exit(1);
    }
    for(int i = 0; i < size; i++) callBackList[i] = tempList[i];
    delete [] tempList;
    size += CALLBACKLIST_INCREMENT;
   }

  callBackList[lastpos] = EventRecord(event,pCBSF);
  lastpos++;
 }

 file://删除注册在指定事件上的成员函数

 void CallBack::RemoveCallBack(char *event, CallBackFunction pCBF, CallBack *pCBO)
 {
  if( (event == NULL)?1:(strlen(event) == 0)) return;
  EventRecord er(event,pCBO,pCBF);

  for(int i = 0; i < lastpos; i++)
   if(callBackList[i] == er) callBackList[i].Flush();
 }

 file://删除注册在指定事件上的静态成员函数或普通函数

 void CallBack::RemoveCallBack(char *event,CallBackStaticFunction pCBSF)
 {
  if( (event == NULL)?1:(strlen(event) == 0)) return;
  EventRecord er(event,pCBSF);

  for(int i = 0; i < lastpos; i++)
   if(callBackList[i] == er) callBackList[i].Flush();
 }

 file://删除注册在指定事件上的所有回调函数

 void CallBack::RemoveCallBack(char *event)
 {
  if( (event == NULL)?1:(strlen(event) == 0)) return;
  for(int i = 0; i < lastpos; i++)
   if(callBackList[i] == event) callBackList[i].Flush();
 }

 void CallBack::CallCallBack(char *event, CallData callData)
 {
  if( (event == NULL)?1:(strlen(event) == 0)) return;
  CallBack *pCBO;
  CallBackFunction pCBF;
  CallBackStaticFunction pCBSF;
  MoveFirst();
  while(!EndOfList())
  {
   file://如当前事件记录和指定事件不匹配,转入下一条记录继续循环
   if(!(callBackList[curpos] == event))
   {
    MoveNext();
    continue;
   }
   file://如找到匹配记录
   pCBO = callBackList[curpos].pointerToCBO;
   file://如事件记录中回调对象指针为空,说明该记录中保存的是静态函数指针
   if(pCBO == NULL){
    pCBSF = callBackList[curpos].pointerToCBSF;
    pCBSF(callData);//调用该静态回调函数
   }
   else file://如事件记录中回调对象指针非空,说明该记录中保存的是成员函数指针
   {
    pCBF = callBackList[curpos].pointerToCBF;
    (pCBO->*pCBF)(callData);// 调用该回调对象的成员函数
   }
   MoveNext();
  }
 }

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论