首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于回调函数,该怎么解决

2013-02-18 
关于回调函数回调函数是什么啊回调函数有什么意义啊为什么我看了网上的介绍 感觉回调函数的作用跟c++里的

关于回调函数
回调函数是什么啊   回调函数有什么意义啊  为什么我看了网上的介绍 感觉回调函数的作用跟  c++里的多态
一样啊 关于回调函数,该怎么解决   最好能举个例子 告诉我用回调函数 和 不用回调函数的区别   大神们先谢谢了关于回调函数,该怎么解决
[解决办法]
程序模块(比如两个类对象)之间需要相互通信,比如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

看里面的通知模型部分就可以了。讨论的很具体。
[解决办法]
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


[解决办法]
回调就是通知,和一般函数所处角度不同而已。

你调用printf使系统打印字符串——站在你的角度看,这是调用printf

因为你调用了printf,系统于是打印了字符串——站在系统角度看,你回调了它的printf,通知系统打印字符串。

我们开发的时候平常说,A做个回调函数给B。也就是A实现回调函数,B调用A的回调函数。

回调的精髓就是“通知关系”,或者主动与被动的关系。

热点排行