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/
C++ 回调函数 实现 的测试代码的更多相关文章
- ajax的回调函数和匿名函数
		
1.什么是js回调函数 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上 ...
 - 异步编程(回调函数,promise)
		
一.回调函数 ①概念:一般情况下,程序会时常通过API调用库里所预先备好的函数.但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函 ...
 - js中的回调函数的理解和使用方法
		
js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...
 - Javascript之回调函数(callback)
		
1.回调函数定义: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方 ...
 - 关于js的callback回调函数的理解
		
回调函数的处理逻辑理解:所谓的回调函数处理逻辑,其实就是先将回调函数的代码 冻结(或者理解为闲置),接着将这个回调函数的代码放到回调函数管理器的队列里面. 待回调函数被触发调用的时候,对应的回调函数的 ...
 - 理解javascript 回调函数
		
##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不 ...
 - ArcGIS API for JavaScript 4.2学习笔记[7] 鹰眼(缩略图的实现及异步处理、Promise、回调函数、监听的笔记)
		
文前说明:关于style就是页面的css暂时不做评论,因为官方给的例子的样式实在太简单了,照抄阅读即可. 这篇文章有着大量AJS 4.x版本添加的内容,如监听watch.Promise对象.回调函数. ...
 - jQuery的deferred对象详解  jquery回调函数
		
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html jQuery的 ...
 - 告诉你什么是javascript的回调函数
		
函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.F ...
 
随机推荐
- 【原】iOS学习之应用之间的操作
			
关于应用之间的相互操作,小编一直觉得非常高大上,在一次面试中被面试官一顿暴虐,今天小编就决定学习一下!经过一顿度娘,找到一些博客,不过都比较凌乱,我就打算自己整理一下! 首先要说的是每一个APP都可以 ...
 - git flow工作流实际项目实践
			
公司项目的开发流程主要是这样 代码分为 develop分支 master分支 平时我开发的时候,主要在develop分支上改动 一般来讲,有以下几种改动方式 1.直接在develop上修改代码 这种一 ...
 - 案例1.通过Jquery来处理复选框
			
实现以下功能: 1:选中第一个复选框,那么下面所有的复选框都选中,去除选中第一个复选框,下面的都不选中 2:当点击全选按钮,上面足球.篮球.游泳.唱歌 全部选中 3:当点击全不选按钮,上面四个全部取消 ...
 - fft练习
			
数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...
 - mongodb的用户管理及安全认证
			
1.确认mongodb的版本 > use admin switched to db admin > db.runCommand({}) { "version" : &q ...
 - JDBC的连接和操作
			
package Test; import java.sql.*; public class Test21 { public static void main(String[] args) { Conn ...
 - nginx-(/etc/init.d/nginx)启动脚本
			
#!/bin/bash #nx Startup script for the Nginx HTTP Server # it is v. version. # chkconfig: - # descri ...
 - TreeView 使用方法:(在View.Details模式下)
			
1.建立TreeView的標題 2.建立TreeView的Item 3.在TreeView的Item中的建立SubItem 如果將各部 ...
 - min.js反压缩
			
给个网址自己体会.. http://jsbeautifier.org/ 当需要修改min.js中的代码时,把min.js文件ctrl+c ctrl+v扔到上面的网页里,点击beautify 即可
 - ant 自动化编译
			
bulid.xml配置: <?xml version="1.0" encoding="UTF-8" ?> <project name=&quo ...