• 什么是回调函数(callback)(转)


    http://www.yuanma.org/data/2006/0605/article_641.htm

     我刚开始接触回调时, 也是一团雾水.很多人解释这个问题时, 总是拿API来举例子, 本来菜鸟最惧怕的就是API, ^_^. 回调跟API没有必然联系.

        其实回调就是一种利用函数指针进行函数调用的过程.
        
        为什么要用回调呢?比如我要写一个子模块给你用, 来接收远程socket发来的命令.当我接收到命令后, 需要调用你的主模块的函数, 来进行相应的处理.但是我不知道你要用哪个函数来处理这个命令,  我也不知道你的主模块是什么.cpp或者.h, 或者说, 我根本不用关心你在主模块里怎么处理它, 也不应该关心用什么函数处理它...... 怎么办?

        使用回调.

        我在我的模块里先定义回调函数类型, 以及回调函数指针.
        typedef void (CALLBACK *cbkSendCmdToMain) (AnsiString sCmd);
        cbkSendCmdToMain    SendCmdToMain;
        这样SendCmdToMain就是一个指向拥有一个AnsiString形参, 返回值为void的函数指针.

        这样, 在我接收到命令时, 就可以调用这个函数啦.
        ...
        SendCmdToMain(sCommand);
        ...

        但是这样还不够, 我得给一个接口函数(比如Init), 让你在主模块里调用Init来注册这个回调函数.

        在你的主模块里, 可能这样

        void CALLBACK YourSendCmdFun(AnsiString sCmd);  //声明
        ...
        void CALLBACK YourSendCmdFun(AnsiString sCmd);  //定义
        {
            ShowMessage(sCmd);
        }
        ...

        调用Init函数向我的模块注册回调.可能这样:

        Init(YourSendCmdFun, ...);

        这样, 预期目的就达到了.


        需要注意一点, 回调函数一般都要声明为全局的. 如果要在类里使用回调函数, 前面需要加上 static  , 其实也相当于全局的.

    EXAMPLE

    声明:typedef void (CALLBACK *lpShowFileOpInfoCbk) (LPVOID lpVoid, const CString &strPathName);

    参数:lpShowFileOpInfoCbk lpCallBack = NULL

    定义:void CXXDlg::ShowFileOpInfoCbk(LPVOID lpVoid, const CString &strPathName)

        {

        }

  • 相关阅读:
    Improving .NET Application Performance and Scalability
    使用PerfView监测.NET程序性能(二):Perfview的使用
    【转载】Configure the max limit for concurrent TCP connections
    Constructor in depth
    使用PerfView监测.NET程序性能(一):Event Trace for Windows
    PHP工程师面临成长瓶颈
    关于前后端字符串长度计算不一致的问题
    最近踩坑汇总
    本周踩坑汇总
    上周踩坑汇总
  • 原文地址:https://www.cnblogs.com/lebronjames/p/1959818.html
Copyright © 2020-2023  润新知