回调函数简介,自己写一个简单的回调函数

来源:互联网 发布:手机led显示屏软件 编辑:程序博客网 时间:2024/06/14 01:21
回调函数简介,自己写一个简单的回调函数
   什么是回调函数?
  首先做一个形象的比喻:
你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数.
    也有这样的说法(比较容易理解):
  回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
  1. 声明;
  2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。
系统所使用的回调函数:
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
程序调用规则:
c(_cdcel)调用规则:
1、参数从右到左压入堆栈
2、函数返回后,调用者负责清除堆栈,这种调用常会生成较大的可执行程序
WINAPI(_stdcall)调用规则:
1、参数从右到左压入堆栈
2、被调用函数返回前自行清理堆栈,生成的代码比cdecl的要小
        
         __fastcall:
__fastcall 它的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。
thiscall:
thiscall只用在C++成员函数的调用,函数参数按照从右向左的顺序入栈,类实例的this指针通过ECX寄存器传递。需要注意的是thiscall不是C++的关键字,不能使用thiscall声明函数,它只能由编译器使用。
参考:
《天书夜读》 第一章)
http://blog.csdn.net/qfdebug/archive/2009/03/15/3992055.aspx
http://icelander.javaeye.com/blog/413493
一下是我写的一个回调函数Demo:
CallbackComm.h:
#ifndef _CALLBACK_COMM_H_
       #define _CALLBACK_COMM_H_
#include <Windows.h>
// 延时 时长
       #define MAX_WAIT   15
//声明回调函数类型。
       typedef void (WINAPI *PFCALLBACK)(int Param) ;
// 被回调的函数
      void __stdcall CallbackFC(int Param);
//线程函数
       DWORD WINAPI ThreadProc1( LPVOID lpParameter );
#endif
/////////////////////////////////////////// end file ///////////////////////////////////////////////
CallbackComm.cpp:
#include "CallbackComm.h"
       #include <math.h>
       #include <stdio.h>


       void __stdcall CallbackFC(int Param)
      {
            printf("\n this is a test ,this program was delayed %d second \n",Param);
       }


      DWORD WINAPI   ThreadProc1( LPVOID lpParameter )
     {
              int delay = rand()%MAX_WAIT;
             Sleep(delay*1000);


              PFCALLBACK CallbackFunc= (PFCALLBACK) lpParameter;
             CallbackFunc(delay);


              return TRUE;
       }
/////////////////////////////////////////// end file ///////////////////////////////////////////////
main.cpp:
#include "CallbackComm.h"


      int main()
     {
CreateThread(
                    NULL,
                       0,
                     ThreadProc1,
                    (LPVOID)CallbackFC,
                      0,
                    NULL );
system("pause");
}
  
原创粉丝点击