关于回调函数

kaiseer8828 2013-01-06 04:43:23
回调函数是什么啊 回调函数有什么意义啊 为什么我看了网上的介绍 感觉回调函数的作用跟 c++里的多态
一样啊 最好能举个例子 告诉我用回调函数 和 不用回调函数的区别 大神们先谢谢了
...全文
341 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
popy007 2013-01-08
  • 打赏
  • 举报
回复
引用 15 楼 kaiseer8828 的回复:
引用 14 楼 popy007 的回复:引用 12 楼 kaiseer8828 的回复: 引用 9 楼 popy007 的回复:kaiseer8828,什么叫中断? 我仔细想了一下 其实回调函数的意义应该就像5楼说的那样,不用轮询了而是以一种类似消息的方式。 其实我想问的是这种机制计算机内部是如何实现的,例如说有A与B 两个程序 他们公用一个变量c,c=0,我想让……
举个例子: extern int c; void f() { //... c = 1; callback_B(); } void g() { m(); n(); f(); } 模块A会在自己的某个操作中调用函数g,而g又调用了函数f,f让全局变量c=1,同时回调模块B,没有任何轮询。
kaiseer8828 2013-01-08
  • 打赏
  • 举报
回复
目前只看懂了怎么用, 但是计算机这种机制的内部实现还是不明白 貌似跑到计算机底层去了。。。
q451157067 2013-01-08
  • 打赏
  • 举报
回复
多态就是 函数指针实现的 回调就是传递一个函数的指针 ... 本质上就是 函数指针 函数指针 就是一个指向函数的入口位置的数 通过这个数 找到函数的入口 通过入口进入这个函数中 ...仅此而已
zhcosin 2013-01-08
  • 打赏
  • 举报
回复
说白了就是个函数指针而已。
jackzhhuang 2013-01-08
  • 打赏
  • 举报
回复
回调就是通知,和一般函数所处角度不同而已。 你调用printf使系统打印字符串——站在你的角度看,这是调用printf 因为你调用了printf,系统于是打印了字符串——站在系统角度看,你回调了它的printf,通知系统打印字符串。 我们开发的时候平常说,A做个回调函数给B。也就是A实现回调函数,B调用A的回调函数。 回调的精髓就是“通知关系”,或者主动与被动的关系。
赵4老师 2013-01-07
  • 打赏
  • 举报
回复
Windows系统:“不要调用我,请先填写好未来收到某个消息时你的处理流程,在那个消息到来时我会调用你!”
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
    struct tm *now;
    struct timeb tb;

    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
  HWND hwnd, // handle of window for timer messages
  UINT uMsg, // WM_TIMER message
  UINT idEvent, // timer identifier
  DWORD dwTime // current system time
) {
 log("In myTimerProc2\n");
}
int main() {
    int i;
    MSG msg;

    SetTimer(NULL,0,1000,myTimerProc1);
    SetTimer(NULL,0,2000,myTimerProc2);
    for (i=0;i<20;i++) {
        Sleep(500);
        log("In main\n");
        if (GetMessage(&msg,NULL,0,0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

    }
    return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2
Kaile 2013-01-07
  • 打赏
  • 举报
回复
回调相当于,你银行帐户上有钱了,自己主动付房租, 不回调就是,房东上门来找你要房租
wintree 2013-01-07
  • 打赏
  • 举报
回复
struct { int type int (*func)(); } int m(); type=1; func=m; 来消息的时候调用根据type 调用相应的m函数。。。 不知道楼主懂了没有啊?
popy007 2013-01-07
  • 打赏
  • 举报
回复
kaiseer8828,什么叫中断?
aiyaya730 2013-01-07
  • 打赏
  • 举报
回复
比如你想知道一个变量从true 变成 false 的时候干1件事, 不用回调要轮巡检测, 用了回调则不用检测,坐等通知 详情可以了解一下函数指针.
kaiseer8828 2013-01-07
  • 打赏
  • 举报
回复
引用 14 楼 popy007 的回复:
引用 12 楼 kaiseer8828 的回复: 引用 9 楼 popy007 的回复:kaiseer8828,什么叫中断? 我仔细想了一下 其实回调函数的意义应该就像5楼说的那样,不用轮询了而是以一种类似消息的方式。 其实我想问的是这种机制计算机内部是如何实现的,例如说有A与B 两个程序 他们公用一个变量c,c=0,我想让A程序里当c=1时 调用 B程序,以下是我的猜想:用回调(消息?)……
“在让c = 1的地方回调,谁让c=1,谁来回调” 可是怎么判断c=1呢,计算机内部是不是要轮询判断c的值呢??
popy007 2013-01-07
  • 打赏
  • 举报
回复
引用 12 楼 kaiseer8828 的回复:
引用 9 楼 popy007 的回复:kaiseer8828,什么叫中断? 我仔细想了一下 其实回调函数的意义应该就像5楼说的那样,不用轮询了而是以一种类似消息的方式。 其实我想问的是这种机制计算机内部是如何实现的,例如说有A与B 两个程序 他们公用一个变量c,c=0,我想让A程序里当c=1时 调用 B程序,以下是我的猜想:用回调(消息?)的方式是不是 在计算机内部……
你的理解慢慢接近正确了。问题的关键就是:在让c = 1的地方回调,谁让c=1,谁来回调。不需要任何轮询。
kaiseer8828 2013-01-07
  • 打赏
  • 举报
回复
发消息 与 收到消息 中间发生了什么 ,就是a发的消息怎么被b收到的,计算机内部是轮询了某种东西 还是 是一种中断的机制 c=1 立刻跳转到 B程序。
kaiseer8828 2013-01-07
  • 打赏
  • 举报
回复
引用 9 楼 popy007 的回复:
kaiseer8828,什么叫中断?
我仔细想了一下 其实回调函数的意义应该就像5楼说的那样,不用轮询了而是以一种类似消息的方式。 其实我想问的是这种机制计算机内部是如何实现的,例如说有A与B 两个程序 他们公用一个变量c,c=0,我想让A程序里当c=1时 调用 B程序,以下是我的猜想:用回调(消息?)的方式是不是 在计算机内部 要存一个“c=1”的模型 和一个 函数地址(就是B程序的地址),模式+地址就是那个回调函数的原型,然后当c=1时,就会执行B程序的地址,可是计算机怎么判断c是否等于1呢,那不是每执行到c,也都要判断c是否=1,那不也是轮询吗? 是不是我的猜想不正确,计算机还有更好的机制来处理这个问题 ? 求各位大神一定帮我讲清楚啊
jimette 2013-01-07
  • 打赏
  • 举报
回复
kaiseer8828 2013-01-06
  • 打赏
  • 举报
回复
5楼的第二种 不是中断吗 跟回调有什么关系呢 6楼说的按需挂载能具体些吗 不太明白啊
引用 3 楼 lile1234_show 的回复:
回调函数是回调函数,多态是多态 他们之间没有相似性,这点你要弄清楚。 回调函数,相当于是定义了一个函数指针,不同的具有相同参数结构的函数都可以赋予这个函数指针, 作为回调函数来使用
3楼 大神 能帮我举个例子吗
ForestDB 2013-01-06
  • 打赏
  • 举报
回复
这个不做项目,空说是没有感受的。
rickys2080 2013-01-06
  • 打赏
  • 举报
回复
回调函数就是用一个函数指针,“按需”挂载函数,调用不同情况下对应需要的函数
popy007 2013-01-06
  • 打赏
  • 举报
回复
程序模块(比如两个类对象)之间需要相互通信,比如a和b,a需要在b达到某个条件的时候做一些事情。通常有两种方法: 1)a主动查询b 2)b在达到条件的时候通知a 前者叫做轮询(poll),是一种主动通信。后者叫做回调(callback),是一种被动通信。 在poll情况下,因为a不知道b什么时候达到条件,因此如果a需要对b迅速反应,就必须在每帧查询b的条件,因此大量的cpu周期被浪费在无谓的查询中。但这种模型编程比较容易。 在callback情况下,a不需要主动查询,a只需要做自己的事情就行了,b在自己达到条件的时候,会主动的通知a,因此a不会浪费cpu周期。但这种模型编程相对poll复杂。 如果想更深入的了解他们,可以参考 http://blog.csdn.net/popy007/article/details/8242787 看里面的通知模型部分就可以了。讨论的很具体。
东莞某某某 2013-01-06
  • 打赏
  • 举报
回复
嗯 所以只要在同一进程空间内,知道目标函数的地址,通过函数指针来调用该函数就叫回调;
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧