C++中建立对象间消息连接的一种系统方法
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
ent, CallBackFunction pCBF, CallBack *pCBO) { //如事件名为空,退出 if( (event == NULL)?1:(strlen(event) == 0)) return; //寻找因删除事件记录而产生的第一个空闲位置,并填写新事件记录 for(int start=0;start<lastpos;start++) if(callBackList[start].IsEmpty()){ callBackList[start] = EventRecord(event,pCBO,pCBF); break; } if(start < lastpos) return; //确实存在空闲位置 //没有空闲位置,在回调表后追加新记录 if(lastpos == size) //回调表已满,需“伸长” { 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,pCBO,pCBF); lastpos++; } void CallBack::AddCallBack(char *event,CallBackStaticFunction pCBSF) { if( (event == NULL)?1:(strlen(event) == 0)) return; for(int start=0;start<lastpos;start++) if(callBackList[start].IsEmpty()){ callBackList[start] = EventRecord(event,pCBSF); break; } if(start < lastpos) return; //a hole is found if(lastpos == size) //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++; } //删除注册在指定事件上的成员函数 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(); } //删除注册在指定事件上的静态成员函数或普通函数 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(); } //删除注册在指定事件上的所有回调函数 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()) { //如当前事件记录和指定事件不匹配,转入下一条记录继续循环 if(!(callBackList[curpos] == event)) { MoveNext(); continue; } //如找到匹配记录 pCBO = callBackList[curpos].pointerToCBO; //如事件记录中回调对象指针为空,说明该记录中保存的是静态函数指针 if(pCBO == NULL){ pCBSF = callBackList[curpos].pointerToCBSF; pCBSF(callData);//调用 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 如何自定义提示窗口(Hint Window)下一篇: 如何自动移去系统托盘失效的图标
关于C++中建立对象间消息连接的一种系统方法的所有评论