什么是回调函数(callback)

模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。 那么我们就把foo称为回调函数。

例子:

回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多, 比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调 过程。本文不准备介绍这些函数和过程,而是谈谈实现自己的回调函数的一些经验。

之所以产生使用回调函数这个想法,是因为现在使用VC和Delphi混合编程,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成之后,需 要通知使用DLL的应用程序:某些事件已经完成,请处理事件的后续部分。开始想过使用同步对象,文件影射,消息等实现DLL函数到应用程序的通知,后来突 然想到可不可以在应用程序端先写一个函数,等需要处理后续事宜的时候,在DLL里直接调用这个函数即可。

于是就动手,写了个回调函数的原形。在VC和 Delphi里都进行了测试

一:声明回调函数类型。

vc版

typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;

Delph版

PFCALLBACK = function(Param1:integer;Param2:integer):integer;stdcall;

实际上是声明了一个返回值为int,传入参数为两个int的指向函数的指针。

由于C++和PASCAL编译器对参数入栈和函数返回的处理有可能不一致,把函数类型用WINAPI(WINAPI宏展开就是__stdcall)或stdcall统一修饰。

二:声明回调函数原形

声明函数原形

vc版

int WINAPI CBFunc(int Param1,int Param2);

Delphi版

function CBFunc(Param1,Param2:integer):integer;stdcall;

以上函数为全局函数,如果要使用一个类里的函数作为回调函数原形,把该类函数声明为静态函数即可。

三: 回调函数调用调用者

调用回调函数的函数我把它放到了DLL里,这是一个很简单的VC生成的WIN32 DLL.并使用DEF文件输出其函数名 TestCallBack。实现如下:

PFCALLBACK   gCallBack=0;

void WINAPI TestCallBack(PFCALLBACK Func)

{

if(Func==NULL)return;

gCallBack=Func;

DWORD ThreadID=0;

HANDLE hThread = CreateThread(   NULL,   NULL,   Thread1,    LPVOID(0),           &ThreadID );

return;

}

此函数的工作把传入的 PFCALLBACK Func参数保存起来等待使用,并且启动一个线程。声明了一个函数指针PFCALLBACK gCallBack保存传入的函数地址。

四: 回调函数如何被使用:

TestCallBack函数被调用后,启动了一个线程,作为演示,线程人为的进行了延时处理,并且把线程运行的过程打印在屏幕上.

本段线程的代码也在DLL工程里实现

ULONG   WINAPI Thread1(LPVOID Param)

{

TCHAR Buffer[256];

HDC hDC = GetDC(HWND_DESKTOP);

int Step=1;

MSG Msg;

DWORD StartTick;

//一个延时循环

for(;Step<200;Step++)

{

StartTick = GetTickCount();

/*这一段为线程交出部分运行时间以让系统处理其他事务*/

for(;GetTickCount()-StartTick<10;)

{

if(PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE) )

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

}

/*把运行情况打印到桌面,这是vcbear调试程序时最喜欢干的事情*/

sprintf(Buffer,"Running %04d",Step);

if(hDC!=NULL)

TextOut(hDC,30,50,Buffer,strlen(Buffer));

}

/*延时一段时间后调用回调函数*/

(*gCallback)(Step,1);

/*结束*/

::ReleaseDC (HWND_DESKTOP,hDC);

return 0;

}

linux callback函数,C++回调函数(callback)的使用相关推荐

  1. python callback函数_python3回调函数(callback)

    之前写代码遇到这个问题已经少,也没有去深究,都是拿来即用. 今天在<python+cookbook中文第三版>中看到了这个问题,做下笔记,以便以后查阅. 回调函数是什么: 以上来自百度百科 ...

  2. linux钩子函数和回调函数,Linux Kernel 学习笔记10:hook函数

    (本章基于: Linux -4.4.0-37) linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃.修改等操作.网络防火墙就是通过此机制实现的. 注册注销hoo ...

  3. C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)

    C++中 线程函数为静态函数 及 类成员函数作为回调函数 线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运 ...

  4. 将类的成员函数作为回调函数(外一篇:友元函数)

    转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题:  回调函数是基于C编程的Windows SDK的技 ...

  5. php 注册回调函数,PHP回调函数

    在开发系统的过程中,有时候希望针对一个对象或者一个值执行多个不相干的操作,那么此时运用回调将是最好的方式,回调函数可以是匿名函数.非匿名函数以及静态方法. class Person{ public $ ...

  6. 函数 php_PHP回调函数及匿名函数概念与用法详解

    1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...

  7. 怎么理解回调函数? 回调函数合集

    网上查了一通,有点体会,特来分享与讨论. ******************************************************************************* ...

  8. java回调函数_PHP回调函数及匿名函数概念与用法详解

    1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...

  9. 如何定义和实现一个类的成员函数为回调函数

    如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++ ...

最新文章

  1. ML基石_2_LearnAnswer2
  2. 一文看懂循环神经网络-RNN(独特价值+优化算法+实际应用)
  3. 小程序之获取用户信息取消授权处理
  4. python中用来表示赋值的符号是_Python3练习题系列(06)——各种符号总结
  5. asp.net获取客户端信息
  6. 浅谈权限(功能权限数据权限)
  7. LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树
  8. 大数据管理:构建数据自己的“独门独院”
  9. linux系统显卡驱动下载官网,NVIDIA显卡Linux系统驱动313.09版下载
  10. 备份容灾相关概念总结
  11. 1.strcpy使用注意
  12. 自动驾驶 6-2: 几何横向控制Lesson 2: Geometric Lateral Control - Pure Pursuit
  13. cisco路由器OSPF基础配置命令
  14. Guava---Joiner
  15. OceanBase 社区版 ODC 功能解读
  16. 职业探索1——霍兰德职业兴趣测试
  17. MPC5607B串口接收中断程序
  18. Unity的一些特效和粒子特效插件
  19. 在win10基础上安装Ubuntu16.04双系统(双硬盘)
  20. 运算符、操作符、if switch语句婚礼纪主页

热门文章

  1. CSS基础(part6)--CSS的颜色表示
  2. Django(part44)--制作分页
  3. Django(part27)--聚合查询
  4. 33个热门数据分析软件,你都用过哪些?
  5. 如何优化Hive SQL ??
  6. 现代 ABAP 编程语言中的正则表达式
  7. SAP Spartacus OCC 请求头部的 Access Token 是如何被添加的
  8. SAP Spartacus baseSite设置的源头 - 路由事件
  9. build.gradle里dependencies标签页的实现原理
  10. SAP CRM webclient ui里直接编写原生的JavaScript