什么是回调函数(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)

    {

    }

posted @ 2011-02-21 15:55  天堂大鸟  阅读(3824)  评论(2编辑  收藏  举报