读书人

关于回调函数解决办法

发布时间: 2012-03-18 13:55:39 作者: rapoo

关于回调函数
关于回调函数有点困惑:
回调函数是自己定义了方法,将函数指针传递给要调用的地方。何时调用由系统决定。
我想知道的是:
系统是怎么知道何时应该调用?是我定义的回调函数的参数决定的?还是回调函数的返回值决定?
回调函数的声明需要满足什么格式?

各位大牛帮我解答下吧!送上80分。

[解决办法]
1.系统是怎么知道何时应该调用?
系统何时调用该函数,这个是定死的,你必须要看代码,或者查询相关文档,看该回调在什么情况下被调用!不是什么参数,或返回值决定的!
2.回调函数的声明需要满足什么格式?
回调函数必须满足该回调指针的定义,就是满足那个函数指针的参数,返回值格式!
[解决办法]
传给另一个函数,由它去调用的都叫回调函数

你所问的问题都要看具体是传给什么函数
[解决办法]
我的理解:
回调函数只是一个概念,就是定义一个方法在某种情况下由别人来调用,它没有一个固定的格式,一些由标准规定比如set_terminate时必须按照标准规定的传一个没有参数并且返回类型为void的函数,但也完全可以在自己需要使用回调函数的上下文下按照自己的需求来实现一个回调函数

至于在什么时候被调用那要看用在哪里,如果是像windows那样基于事件/消息的框架下,就是当消息到达时被调用,如果是异常处理或是中断处理程序就是在异常/中断发生时被调用

系统底层的实现也是各种各样的,比如中断就是用中断向量表实现,等等
[解决办法]
楼上几位说的太N的,LZ看得懂吗?
其实回调就是普通的函数,只不过用户不能调用,只能作为指针被系统用如下:

void test() //假如它是回调
{
}

void Sys((*p)()) //系统函数Sys,参数为一个函数指针
{
}

在系统一大堆代码里面有一个调用
...
Sys(test); //在这一点,触发
...


当然如果用户调用test(),这是被禁止的。
[解决办法]
我想知道的是:
系统是怎么知道何时应该调用?是我定义的回调函数的参数决定的?还是回调函数的返回值决定?
回调函数的声明需要满足什么格式?

我告诉你在下雨的时候收衣服,收衣服是回调函数,你是系统,下雨这个事件就是调用的时候.(下雨就相当于消息,WndProc)
我告诉你在把所有的钱给我,把钱给我就是回调函数,你是系统,你开始寻找(枚举)你所有的钱,然后找到的时候给我.(这个就是补充一个行为,比如EnumWindow)
通常什么时候调用和你需要系统帮你做的事有关,有的时候是等某个消息,信号,事件,有的时候需要马上动作...本质上是一样的.

回调函数的参数和系统提供的这个接口有关.比如下雨衣服,可能传进的参数就是对某件衣服的引用,在回调函数里把这个衣服标记为在室内.而其它的又不同.
回调函数的返回值也是在提供接口的时候,比如系统要知道你处理的结果.
格式一般只有函数的调用方式:__stdcall,要求自己处理栈.其它的返回类型,参数类型,参数个数,都是由功能和设计决定的.
[解决办法]

探讨
有点清楚了,
也就是说我定义的回调函数何时调用,要看它把指针传递给谁。这个“谁”在其实现中已经写死了什么情况下该调用它。
而不是依据我定义的回调函数。
不知道理解的对不对?

[解决办法]
回调其实一般是用在异步调用的情况。。

你发个请求给我,要我实现一些功能,然后我告诉你结果,你再根据我给你的结果做下一步操作。。

这个case就可以用一个回调:

我提供方法:
int handleRequest(RequestType /*request*/, HandleType /*handler*/);
//handler 是一个函数指针,你定义的函数,准备做得到我给你结果后的下一步操作

你调用我的方法,提供给我你要的请求,还有我做完请求后,你要执行的函数。。
这个函数是你的处理函数,但是你传给我,当我做完请求后,我来调用你的函数。。
同时在我的handleRequest里,我会异步给你返回值,所以你可以在等待我完成请求的时间内,继续做别的事,而不用等待在那。。
等我完成了你的请求,你的处理函数也就被我调用了。。

你的handler就是一个回调函数。。

读书人网 >C++

热点推荐