我是靠谱客的博主 俭朴服饰,最近开发中收集的这篇文章主要介绍C++ 回调函数 实现 的测试代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近项目里使用了异步Socket,使用的是完成端口做的e; Accept,receive,send 等完全的异步实现(多线程)

然后 又要多个端口使用, 后来想到包装下完成端口Socket,然后当有事件是触发回调函数,就不用手动搞N多个线程什么的

如是,测试例子如下:

#include "stdafx.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//回调函数 实现 的测试
#define __CallBackTestFun__
/*回调函数
**回调函数实现体必须是静态方法,并且应该使用"__stdcall"声明;
应该接受参数转换成本类指针,然后才能操作本类的成员
**即:static void __stdcall Fun(void* pthis,...)
*/
#ifdef __CallBackTestFun__
typedef void(__stdcall*POnData)(void*,unsigned int,void*) ;
typedef void(__stdcall*POnReccive)(void*,unsigned int) ;
class TSocketObj
{
private:
POnData pOnData,pp;
POnReccive pOnReccive;
void* tag;
protected:
void OnData(){pOnData(tag,123,"1234");}
public:
int No;//
unsigned char type; //0:TCP
1:UDP
unsigned int sock;
void* pdata;
char name[21];
TSocketObj *next,*prior;
TSocketObj(){memset(this,0,sizeof(TSocketObj));}//初始化 也很重要
TSocketObj(void* Obj){
memset(this,0,sizeof(TSocketObj));
tag=Obj;
printf("nObj:%xn",tag);
}
void SetCallBack(void* Obj,POnData onData,POnReccive onReccive){
tag=Obj;pOnData=onData;pOnReccive=onReccive;
}
void SetP(POnData p){pp=p;}
void Go(){
if(pOnData)pOnData(tag,sock,name);
if(pOnReccive)pOnReccive(tag,No);
if(pp)pp(tag,sock,name);
}
};
class TSocket
{
TSocketObj socks;
public:
int m;
TSocket(){}
TSocket(int n){
Set(n);
}
static void __stdcall OnData(void* pThis,unsigned int no,void* d)
{
printf("nThis is:%d
Sock:%dtname:%s",((TSocket*)pThis)->m,no,d);
}
friend void __stdcall OnReccive(void* pThis,unsigned int d)
{
printf("ntNo:%dn",d);
}
//这个不能做回调函数
void __stdcall OnGo(void* pThis,unsigned int no,void* d)
{
printf("ntOnGo m:%dn",m);
}
void Set(int d){
m=1000+d;
socks.No=d;
socks.sock=100*d+78;
sprintf(socks.name,"Sock_%d",d);
socks.SetCallBack(this, OnData, OnReccive);
//POnData p=&(this->OnGo);
//socks.SetP((void*)&this->OnGo);
}
void show(){socks.Go();}
};
#endif
int main(int argc, char* argv[])
{
int iarr[10]={1,5,3,2,7,4,9,6,8,0};//BrdNo
//回调函数 实现 的测试
#ifdef __CallBackTestFun__
TSocket tr;
tr.Set(7);
tr.show();
TSocket ty;
ty.Set(8);
ty.show();
#endif
scanf("%d",iarr);
return 0;
}

  这是个完整的例子,转载请注明:http://www.cnblogs.com/lzpong/

 

转载于:https://www.cnblogs.com/lzpong/p/4228357.html

最后

以上就是俭朴服饰为你收集整理的C++ 回调函数 实现 的测试代码的全部内容,希望文章能够帮你解决C++ 回调函数 实现 的测试代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部