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:%x\n",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:%d\tname:%s",((TSocket*)pThis)->m,no,d);
	}
	friend void __stdcall OnReccive(void* pThis,unsigned int d)
	{
		printf("\n\tNo:%d\n",d);
	}
	//这个不能做回调函数
	void __stdcall OnGo(void* pThis,unsigned int no,void* d)
	{
		printf("\n\tOnGo m:%d\n",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/

时间: 2024-11-05 22:44:12

C++ 回调函数 实现 的测试代码的相关文章

Glide.with(Activity) 也是让 Activity 创建出一个 Fragment ,在 Fragment 的各个生命周期方法内插入回调函数后,执行代码来实现的

SupportActivity.java(support库)------------------------------ @Override @SuppressWarnings("RestrictedApi") protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ReportFragment.injectIfNeededIn(this); }

实验二:事件驱动-回调函数实现爬虫

承接上一节课,我们在上节课中提到,socket I/O 阻塞时的那段时间完全被浪费了,那么要如何节省下那一段时间呢? 非阻塞I/O 如果使用非阻塞I/O,它就不会傻傻地等在那里(比如等连接.等读取),而是会返回一个错误信息,虽然说是说错误信息,它其实就是叫你过一会再来的意思,编程的时候都不把它当错误看. 非阻塞I/O代码如下: sock = socket.socket() sock.setblocking(False) try: sock.connect(('xkcd.com', 80)) ex

理解与使用Javascript中的回调函数 -2

在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply()函数的,或者有一些简短的关于callback的使用示例. 函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用 Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串

js中的回调函数的理解和使用方法

一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上是一种对象,它可以存储在变量中,通过参数传递给另一个函数,在函数内部创建,从函数中返回结果值",因为函数是内置对象,我们可以将它作为参数传递给另一个函数,到函数中执行,甚至执行后将它返回,它一直被"专业的程序员"看作是一种难懂的技术. 回调函数的英文解释为: A callback is a functi

ArcGIS API for JavaScript 4.2学习笔记[7] 鹰眼(缩略图的实现及异步处理、Promise、回调函数、监听的笔记)

文前说明:关于style就是页面的css暂时不做评论,因为官方给的例子的样式实在太简单了,照抄阅读即可. 这篇文章有着大量AJS 4.x版本添加的内容,如监听watch.Promise对象.回调函数.异步处理等内容,原理性的东西我会在文末解释,各位看官不用担心看不懂,我尽量用通俗的语言解释这些. 惯例,如果不习惯从头看到尾,可以直接跳到后面看总结. 大家应该看过商业地图的缩略图功能吧?以度娘地图为例,在使用街景地图的时候,左下角会出现一个地点一样的2D小地图: 这个就是鹰眼功能的应用,在很多桌面

Node.js学习笔记(3)——关于回调函数和函数的回调

说明:本人是node.js的初学者,尝试向别人解释这是怎么回事是自我学习的一个好方法.如果你发现有些地方并不是那么正确,欢迎提出来让我知道以便修正,共同进步,谢过^_^.       欢迎交流,本人微博:http://weibo.com/bitsea  很多地方都涉及到函数的回调,在这里简单说一下什么是函数的回调. 回调函数就是回来再调用的函数. 基于js的单线程执行代码的风格,回调是必须的选择.也可以说是一种不得已而为之的选择吧,回调无疑增加了代码的复杂性,使其变得难读.难理解,难维护.但是,

关于js的callback回调函数的理解

回调函数的处理逻辑理解: 所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的代码才会从管理器队列取出来并自动执行(激活回调函数的代码),实现异步的编程效果. 不过,对于一些必须要等回调函数执行完毕才可以确定的动作,实际上,就是会掉入一个层层回调的局面了.这点也是回调函数的复杂的地方! 换句话说,只要您要获取的值是要被回调才确定的,那接下来的所有代码都必须用回调的方式来编写

告诉你什么是javascript的回调函数

在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply()函数的,或者有一些简短的关于callback的使用示例. 函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串包

Javascript之回调函数(callback)

1.回调函数定义: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A.我们就说函数A叫做回调函数.如果没有名称(函数表达式),就叫做匿名回调函数.因此callb