回调函数定义和使用

来源:互联网 发布:java 64位win7 编辑:程序博客网 时间:2024/06/07 03:56
 最近经常使用回调函数,有时感觉有点混乱,对回调函数理解不透,昨天花点时间深深品味了一下回调函数,写下博客记录一下,言规正转,VC中的定时器是一种特殊的回调函数,只要我们设置好了定时器,我们就不用管什么时候调用定时器处理函数,是操作系统负责调用,定时器的处理函数还是我们自己去写实现。

      为什么 要用回调函数呢,这个问题我也想过,现在先说说回调函数的定义 和使用,过下在回答为什么 要使用回调函数,

    下面这个例子是处理从一个普通的C++类CTest中把数据传到一个对话框类CTestCALLDlg中去,这里不能用消息来处理,因为消息只能处理线程和对话框之间的数据传输,对纯C++不起作用,这种情况 下,就只能用回调函数来处理了,

     在Test.h文件中CTest定义之前定义 typedef  bool (WINAPI * SendCmd)(WORD NodeID);用于声明一种指针类型,也就是后面要用到的回调函数类型,在在Test.h文件中定义一个成员函数void Testcall(SendCmd);注意这个成员函数的参数,在Test.cpp中:

void CTest::Testcall(SendCmd Sd)
{
 Sd(10);

}

在CTestCALLDlg.cpp中写下回调函数SendCmdt 的实现部分 和 OnBnClickedButton1事件调用

bool _stdcall CALLBACK SendCmdt(WORD NodeID)
{
 return true;
}

void CTestCALLDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
 CTest m_test;
 m_test.Testcall(SendCmdt);
}

此时程序运行,就进入了回调函数中去了,这样做的目的是把NodeID变量 的值从CTest类传到CTestCALLDlg类中,回调函数的一个好处是 在CTest 中不知道NodeID 有什么用,只能通过回调作用,传出来到要使用的地方进行处理,只是在回调函数声明时告诉系统有这么一个函数,实现部分在外面 。。。。 上面的问题也应该 不用回答了,,

     就写到这了, 文字写的不够流畅,希望回调函数的使用和作用表达清楚 了,呵呵





typedef void (*cback)(int a,LPVOID  userParam);    //回调函数原型定义

 

public:
    afx_msg void OnBnClickedButton1();
public:
    bool myloop(int a, cback UserFun, LPVOID userParam);

 

void MyCallBack(int a, LPVOID userParam)
{
    //AfxMessageBox("你好");
    AfxMessageBox((char *)userParam);
}

void CCallBackDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    char *buffer = "子坞阁";
    myloop(1, MyCallBack, buffer);
}

bool CCallBackDlg::myloop(int a, cback UserFun, LPVOID userParam)
{
    UserFun(1, userParam);
    return true;
}

【参考资料 感谢作者】
回调函数百度百科:http://baike.baidu.com/view/414773.html?fromTaglist