linux callback函数,C++回调函数(callback)的使用
什么是回调函数(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)的使用相关推荐
- python callback函数_python3回调函数(callback)
之前写代码遇到这个问题已经少,也没有去深究,都是拿来即用. 今天在<python+cookbook中文第三版>中看到了这个问题,做下笔记,以便以后查阅. 回调函数是什么: 以上来自百度百科 ...
- linux钩子函数和回调函数,Linux Kernel 学习笔记10:hook函数
(本章基于: Linux -4.4.0-37) linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃.修改等操作.网络防火墙就是通过此机制实现的. 注册注销hoo ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)
C++中 线程函数为静态函数 及 类成员函数作为回调函数 线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运 ...
- 将类的成员函数作为回调函数(外一篇:友元函数)
转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题: 回调函数是基于C编程的Windows SDK的技 ...
- php 注册回调函数,PHP回调函数
在开发系统的过程中,有时候希望针对一个对象或者一个值执行多个不相干的操作,那么此时运用回调将是最好的方式,回调函数可以是匿名函数.非匿名函数以及静态方法. class Person{ public $ ...
- 函数 php_PHP回调函数及匿名函数概念与用法详解
1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...
- 怎么理解回调函数? 回调函数合集
网上查了一通,有点体会,特来分享与讨论. ******************************************************************************* ...
- java回调函数_PHP回调函数及匿名函数概念与用法详解
1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...
- 如何定义和实现一个类的成员函数为回调函数
如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++ ...
最新文章
- ML基石_2_LearnAnswer2
- 一文看懂循环神经网络-RNN(独特价值+优化算法+实际应用)
- 小程序之获取用户信息取消授权处理
- python中用来表示赋值的符号是_Python3练习题系列(06)——各种符号总结
- asp.net获取客户端信息
- 浅谈权限(功能权限数据权限)
- LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树
- 大数据管理:构建数据自己的“独门独院”
- linux系统显卡驱动下载官网,NVIDIA显卡Linux系统驱动313.09版下载
- 备份容灾相关概念总结
- 1.strcpy使用注意
- 自动驾驶 6-2: 几何横向控制Lesson 2: Geometric Lateral Control - Pure Pursuit
- cisco路由器OSPF基础配置命令
- Guava---Joiner
- OceanBase 社区版 ODC 功能解读
- 职业探索1——霍兰德职业兴趣测试
- MPC5607B串口接收中断程序
- Unity的一些特效和粒子特效插件
- 在win10基础上安装Ubuntu16.04双系统(双硬盘)
- 运算符、操作符、if switch语句婚礼纪主页
热门文章
- CSS基础(part6)--CSS的颜色表示
- Django(part44)--制作分页
- Django(part27)--聚合查询
- 33个热门数据分析软件,你都用过哪些?
- 如何优化Hive SQL ??
- 现代 ABAP 编程语言中的正则表达式
- SAP Spartacus OCC 请求头部的 Access Token 是如何被添加的
- SAP Spartacus baseSite设置的源头 - 路由事件
- build.gradle里dependencies标签页的实现原理
- SAP CRM webclient ui里直接编写原生的JavaScript