1. 定义
我们先来看看回调的英文定义:
A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。
- 字面上的理解,回调函数就是一个参数,
- 将这个函数作为参数传到另一个函数里面
- 当那个函数执行完之后,再执行传进去的这个函数。
这个过程就叫做回调。
2. 理解
其实也很好理解对吧,回调,回调,就是回头调用的意思。
主函数的事先干完,回头再调用传进来的那个函数。
3. 举例子
举一个别人举过的例子:约会结束后你送你女朋友回家,离别时,你肯定会说:“到家了给我发条信息,我很担心你。” 对不,然后你女朋友回家以后还真给你发了条信息。小伙子,你有戏了。其实这就是一个回调的过程。你留了个参数函数(要求女朋友给你发条信息)给你女朋友,然后你女朋友回家,回家的动作是主函数。她必须先回到家以后,主函数执行完了,再执行传进去的函数,然后你就收到一条信息了。
参考
https://blog.youkuaiyun.com/angciyu/article/details/80794273
4. C++回调函数必须为静态函数的原因
c++类中线程函数为 static
4.1 原因: 函数参数类型匹配
原来非静态成员函数都会在参数列表中加上一个this指针为为参数, 这样的话你写的线程函数就不符合调用规定了.
比如 DWORD WINAPI ThreadFun(LPVOID); 是非静态的,实际编译后,就会变成
DWORD WINAPI ThreadFun(LPVOID, CMyClass *this);
这个函数就明显不能作为线程的函数了, 因为多了个参数.所以编译就过不了了.
因为线程函数 ThreadCreate 调用 CreateThread 第四个参数 lpParameter 是传给线程函数的参数。
加上static修饰后,类的成员函数就不会被加上默认的this参数,所以就符合调用规定了
4.2 例子
线程函数:
static Thread_result_t VA_THREAD_CALL thread_xxxWorking(void *arg);
回调函数:
static xxxCallBackWakeup(void *pUserParam, const ivChar param); / xxxx回调函数 */
ret = m_hxxxInst->xxxRegisterCallBacks(“func_wake_up”, xxxCallBackWakeup, this);